www.mikrocontroller.net

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


Autor: Marten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du auch in den Projektoptionen "Use 64-bit doubles" markiert?

MW

Autor: Marten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Marten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Marten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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. ;-)

Autor: Marten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Marten (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.