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
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.
Hast du auch in den Projektoptionen "Use 64-bit doubles" markiert? MW
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.
@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.
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
> 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.
>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 :-)
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.
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?
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
@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.
>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
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. ;-)
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?
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 :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.