On Sat, Sep 06, 2003 at 06:34:47PM +0200, Tom Guder wrote:
Wenn ich zu einer float Variable einen Wert (0.1 z.B) ständig abziehe oder addiere, entstehen Ungenauigkeiten. Wenn die Variable z.B. 1.000000 enthalten sollte, enthält sie nach einiger Zeit des Rechnens 1.000001 oder 0.999999 oder noch schlimmer. Was kann man dagegen tun?
http://www-lehre.informatik.uni-osnabrueck.de/~ainf/2000/skript/node18.html
m.W.: Nein. Das ist normal. float- und double-Variablen speichern Exponent und Mantisse einer Zahl, dabei hat die Mantisse nur eine begrenzte Genauigkeit. Das ist grob die Anzahl der *signifikanten* Stellen, die Du darstellen kannst. So wie Du beim "wissenschaftlichen" Taschenrechner zwar einen Zahlenbereich bis .... 10^99 hast, aber trotzdem immer nur 8 bis 10 signifikante Stellen.
Wenn's z.B. um genaue Genauigkeit geht (Finanzen), die von der Struktur her keine Rundungsfehler vertragen, dann ist's besser, das alles mit int oder Abarten davon zu rechnen. (Klar, nicht einfach alles in Euronen, dann fehlen Dir wieder die Cent, sondern gleiche alles in Centd, dann gibt's keine Rundungsprobleme...).
Und es ist keine gute Idee (siest Du ja jetzt), bei float's auf Gleichheit zu testen. Bei uns gab's immer ein '5 - Setzen!' wenn wir etwa sowas geschrieben haben:
... while (i != 0.5) { ... }
Weil die Chance, genau die 0.5 zu verfehlen, recht groß ist. Besser wäre hier (in Abhänigkeit vom Problem) etwa:
... while (i >= 0.5) { .... }
Heiko