Forum: Compiler & IDEs Genauigkeit float


von prakti (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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

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


Lesenswert?

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.

von Dominik R. (domy)


Lesenswert?

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

von U.R. Schmitt (Gast)


Lesenswert?

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.

von prakti (Gast)


Lesenswert?

Danke fuer die Bestaetigung und Korrektur!

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


Lesenswert?

U.R. Schmitt schrieb:
> Wenn Du größere Genauigkeit brauchst nimm double statt float

Nein.  Er schrieb was von AVR-GCC.

von Detlef _. (detlef_a)


Lesenswert?

>>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
Noch kein Account? Hier anmelden.