Genauigkeit float

#1883859
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
Moderator Persönliche Seite #1883860
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.
#1883870
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
Gast #1883875
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren