Hallo, kann mir jemand aus dem Stegreif sagen, was avr-gcc daraus macht? 1.006437 -5.248084e-08 = ? Ich fuerchte an die Grenzen der Genauigkeit gestossen zu sein. Was kann man dann noch machen?
prakti schrieb: > Hallo, > > kann mir jemand aus dem Stegreif sagen, was avr-gcc daraus macht? > 1.006437 -5.248084e-08 = ? In Bezug auf 1.0 sind 5e-08 praktisch 0. Zumindest mit float > Ich fuerchte an die Grenzen der Genauigkeit gestossen zu sein. Du meinst Auflösung. > Was kann > man dann noch machen? Ansprüche zurückschrauben. Die Berechnung noch einmal als Ganzes durchgehen. Sich überlegen, ob es tatsächlich notwenig ist, von 1 ein 100-Millionstel abzuziehen. Wie verändert sich das Gesamtergebnis wenn du es nicht tust? Berechnungen umstellen
Bei 24 bit Gleitkomma-Mantisse hast du 6...7 Dezimalstellen an Auflösung. Eine Subtraktion von 1E-8 von 1 wird sich also im Ergebnis nicht mehr niederschlagen. Entweder Festkommarechnung oder du kannst dich auch mal umsehen, es gibt auch Bibliotheken, die mehr als 32-bit-FP implementieren, da hast du dann nur keinerlei Compiler-Unterstützung dafür, also sowas wie my64bitfp_t maybe_pi = 3.141592618281828; geht dann nicht.
Hey, wenn du genau wissen willst was mit deiner Zahl passiert dann schau in der IEE754 nach, da sind die Gleitkommazahlen exakt definiert, bei dir wäre das mit single precision: - Exponent: 8bit - Mantissa: 23bit - Sign: 1bit Wandle deine Zahle selbst mal von Hand in dieses Format um und schaue was herauskommt, so geht man an die Sache ran. Jetzt einmal eine ganz andere Frage: Findest du nicht, dass deine Rechnung unnötig ist? Brauchst du denn diese Genauigkeit und auf wie viele Stellen genau ist deine 1.006437??? hast du die Zahl gerundet oder sie wirklich auf 14 Nachkommastellen genau berechnet so wie deine zweite Zahl? Denn nur dann würde diese Rechnung ansatzweise Sinn machen. Gruß Dominik
Ich gehe davon aus, daß das minus vor der 5 eine Rechenoperation darstellen soll. Eine normale Float hat etwas 7-9 signifikante Stellen wenn ich mich recht erinnere. Also bist Du definitiv im Bereich der Genauigkeit bei dieser Operation. Wenn Du größere Genauigkeit brauchst nimm double statt float, dann hast du ca 16 signifikante Stellen. Es gibt auch Möglichkeiten mit entsprechend großen BCD codierten Zahlen eine fast beliebige Anzahl signifikanter Stellen zu erhalten, allerdings braucht man die entsprechende Bibliothek oder muss sich die Rechenoperationen selbst schreiben. Dir Frage ist wie genau macht Deine Rechnung Sinn? Manche Rundungsprobleme kann man in den Griff kriegen indem man bei der Rechnung eine günstigere Reihenfolge wählt.
U.R. Schmitt schrieb: > Wenn Du größere Genauigkeit brauchst nimm double statt float Nein. Er schrieb was von AVR-GCC.
>>Entweder Festkommarechnung oder du kannst dich auch mal umsehen, >>es gibt auch Bibliotheken, die mehr als 32-bit-FP implementieren, Beitrag "64 Bit float Emulator in C, IEEE754 compatibel" ;-)) Cheers Detlef
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.