Forum: Compiler & IDEs IAR math funktion mit 64bit double


von Marten (Gast)


Lesenswert?

Hallo

ich hoffe hier kann mir jemand helfen.Ich benutze den IAR AVR Compiler
und würde gern mit 64bit double werten rechnen.Leider bringt mein
kleines Testprogramm bei 64bit keine vernünftigen Werte. Mit 32bit
double klappt die Berechnung problemlos.
Die CLIB ist eigentlich auch für 64bit ausgelegt, muss man da evt. noch
was einstellen?

hier noch ein Auszug aus meinen Testprogramm:

union convert{
  unsigned char bytes[sizeof(double)];
  double value;
} ;

-----------------------
    union convert test;
    test.value=pow(12.5,2.5);
    for (char i=0 ; i<sizeof(double) ; i++ )
    {
    PORTA=sizeof(double)-i;
    DDRA=test.bytes[sizeof(double)-1-i];
    }


MfG Marten

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Nun, ein wenig bist du im falschen Forum gelandet (hier geht's um
GCC).

Keine rechte Antwort, aber Warum Zum Geier[tm] willst du eigentlich
die CLIB verwenden?  Das ist doch nur hysterischer Ballast, für
alles, was man neu anfängt, sollte man doch besser gleich die
DLIB nehmen.

von Michael Wilhelm (Gast)


Lesenswert?

Hast du auch in den Projektoptionen "Use 64-bit doubles" markiert?

MW

von Marten (Gast)


Lesenswert?

Sorry wenns etwas off-topic ist. Hab gedacht hier passts noch am besten
rein.


Die DLIB hab ich auch probiert:
64bit
pow(12.5,2.5) = 0x3E47C8B3EED3FC90=1.1075285989094812e-8 falsch

32bit
pow(12.5,2.5) = 0x440a1b57=552.42719 richtig

Mit CLIB:
64bit
pow(12.5,2.5)=  0x0000000000000000 falsch

32bit
pow(12.5,2.5) = 0x440a1b57=552.42719 richtig

Andere Funktionen wie exp() funktionieren im 64bit modus auch nicht
richtig. Muss ich evt. noch etwas includen? Hab jetzt math.h und
float.h drin.


@Michael Wilhelm
ja , da ist ein Haken drin.

von Michael (Gast)


Lesenswert?

@Marten

Du mußt double aktivieren und u.U. die richtige LIB verwenden, die ein
'-64' aufweisen muß. Dann sollte es klappen, wenn nach der
Aktivierung alles auch neu kompiliert wird.

Im Prinzip kannst Du in diesem Forum fragen, was Du willst, solange
nicht die Buchstaben i, a und r zusammen geschrieben darin vorkommen.
Das sind nämlich die Bösen und dann gibt's Schimpfe. Die Guten
schreiben sich GCC.

von Michael Wilhelm (Gast)


Lesenswert?

Nur eine Idee:
pow((signed long long)12.5,2.5)
Nun muss der Compiler beide Variablen in long long casten. So
"müsste" es gehen. Sag mal Bescheid.

MW

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Im Prinzip kannst Du in diesem Forum fragen, was Du willst, solange
> nicht die Buchstaben i, a und r zusammen geschrieben darin
> vorkommen.

Genau, darum hat er ja auch ausschließlich dumme Kommentare bislang
bekommen, nicht wahr?

> Das sind nämlich die Bösen und dann gibt's Schimpfe.

Zumindest die teuersten, was den Compiler angeht.  Ziemlich mit
Abstand, wenn ich mich nicht irre.

von Michael (Gast)


Lesenswert?

>Zumindest die teuersten, was den Compiler angeht.  Ziemlich mit
Abstand, wenn ich mich nicht irre.<

Mag alles sein; aber er kann 64-Bit double. Ich weiß, ich weiß, so
etwas braucht doch keiner :-)

von Marten (Gast)


Lesenswert?

Also das mit den 3 Buchstaben wusst ich nicht.Werd in Zukunft
aufpassen;)
Bisher hab ich ja auch den GCC verwendet, bloss jetzt brauch ich etwas
höhere Genauigkeit und da wärs schon toll wenn man das nicht alles
selbst implementieren muss.

Also hab jetzt alle Dateien gelöscht und nochmal neu kompiliert leider
ohne Erfolg. Hab auch gecheckt ob es die richtige Library ist, double
64bit ist an, scheint alles zu stimmen.
(library ist dlAVR-3s-ec-sf-64-n.r90)
Weiss echt nicht woran es liegen könnte.

Was merkwürdig ist:
(DLIB 64 bit)

sin(9.5)=0xbfb33d1a94a4277b=-0.07515112046180931 ist richtig.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Naja, 64-bit double für GCC steht auch auf der Wunschliste...  Es
braucht nur jemanden, der beherzt genug ist (und die nötige Zeit
und Energie hat), das auch mal anzugehen.

Hast du für den IAR denn Geld bezahlt?  Dann könntest du ja einen
Support request bei denen aufmachen.

Kann den ein sprintf() den Wert richtig ausgeben?

von Marten (Gast)


Lesenswert?

Das casten hat leider nix gebracht:

mit cast
(DLIB 64)

0x3e2cf6473ec2c67e = 3.371623416298661e-9



@Jörg Wunsch
Hab hier eine Version zum Ausprobieren von meinen Prof. bekommen
Da will ich den Support nicht unbedingt benutzten ...

sprintf liefert:

(DLIB 64bit)

AVR Simulator: Invalid opcode 0xffff at address 0x005858
(mal was neues)

(DLIB 32Bit)
bei Gleitkommazahlen (einzelnen chars dezimal)
"3.14" --> 102d 0d 52d 0d 255d ... falsch

bei integer
"314" -->  51d 50d 52d 0d 255d .. stimmt

von Michael (Gast)


Lesenswert?

@Marten

Du könntest Dir noch das Listing des Linkers ansehen, ob die richtigen
Routinen eingebunden sind. Und ferner im Code-Listing kontrollieren, ob
auch 64-Bit Variablen verwendet werden. Deine falschen Werte lassen
vermuten, daß nur 32-Bit Variablen gehandhabt, aber dann 64-Bit
erwartet und 'verrechnet' werden.
Hast Du u.U. eine abgemagerte Version, die nur 'float' zuläßt ?

Noch etwas: gibt es vielleicht noch etwas bei 'printf()' falsch zu
machen ? Hab's länger nicht mehr verwendet.

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

>Mag alles sein; aber er kann 64-Bit double. Ich weiß, ich weiß, so
>etwas braucht doch keiner :-)

Darum gehts doch garnicht.
Sämtlicher Support zum GCC, zudem noch in deutscher Sprache, hier auf
dieser Seite ist vollkommen kostenfrei für den Fragesteller und
kostet den Antwortenden u. U. eine ganze Menge Freizeit. Fragen, die
eine Toolchain eines Anbieters betreffen, der für seinen Support Geld
bekommt, werden deshalb 'nicht gerne' gesehen. In diesem Fall wurde
sogar noch Bezug auf diese Frage genommen, was ich auch schon anders
erlebt habe (die Frage wäre im 'Allgemeinen' Forum richtig aufgehoben
gewesen)!
Da darf so ein leichter Seitenhieb doch wohl noch sein, oder? ;-)

Anyway, HTH

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Vermutlich wäre der bislang in das Thema gesteckte Aufwand bereits
jetzt besser in eine 64-bit-FP-Implementierung für den AVR-GCC
gesteckt. ;-)

von Marten (Gast)


Lesenswert?

Also ich gebs auf... Ich weiss nicht woran es noch liegen könnte. Hab
alle möglichen Einstellungen durchprobiert. Auch die IDE neu
installiert, aber ohne Erfolg.
Was evt. noch eine Fehlerquelle sein könnte ist das Debugformat.
Generiert wird UBROF8, ich weiss nicht ob das AVR Studio damit klar
kommt.

Hab jetzt schon mal testweise eine eigene Version von exp()
geschrieben. Funktioniert zwar ,allerdings ist die seeeehr langsam.
Gibt es irgendwo gut dokumentierten C-Code zu den math und stdio
funktionen?

von Michael (Gast)


Lesenswert?

Hast Du denn die Parameterübergabe an die Funktionen und printf()
überprüft ? Und was ist dort zu sehen ?

Mit Aufgeben ist noch keiner ans Ziel gelangt. Probleme sind dazu da,
daß man sie löst. Geschenke gibt's zu Weihnachten :-)

von Marten (Gast)


Angehängte Dateien:

Lesenswert?

printf bringt mir einen Fehler:

Error[e46]: Undefined external "__write" referred in ?putchar (
C:\Programme\IAR Systems\Embedded ..

Der Aufruf ist doch einfach printf("%f",wert)  oder?

Im Anhang ist ein Listing vom Linker, so richtig schlau werd ich aber
nicht draus.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.