Im Allgemeinen bezieht sich der Gleitkommafehler auf eine Zahl, die nicht in der IEEE-Gleitkommadarstellung gespeichert werden kann.
Integer werden mit dem am weitesten rechts liegenden Bit mit der Nummer 1 gespeichert, und jedes Bit auf der linken Seite ist doppelt so groß (2,4,8, ...). Es ist leicht zu sehen, dass dies jede ganze Zahl bis zu 2^n speichern kann, wobei n die Anzahl der Bits ist.
Die Mantisse (Dezimalteil) einer Gleitkommazahl wird auf ähnliche Weise gespeichert, bewegt sich jedoch von links nach rechts, und jedes nachfolgende Bit ist die Hälfte des Werts des vorherigen. (Es ist tatsächlich ein wenig komplizierter als das, aber es wird für jetzt tun).
So sind Zahlen wie 0,5 (1/2) einfach zu speichern, aber nicht jede Zahl < 1 kann durch Hinzufügen einer festen Anzahl von Brüchen der Form 1/2, 1/4, 1/8 erstellt werden. ...
Ein wirklich einfaches Beispiel ist 0,1 oder 1/10. Dies kann mit einer unendlichen Reihe gemacht werden (die ich nicht wirklich stören kann), aber wenn ein Computer 0,1 speichert, ist es nicht genau diese Nummer, die gespeichert wird.
Wenn Sie Zugang zu einem Unix-Rechner haben, ist es einfach, das zu sehen.
Python 2.5.1 (r251:54863, Apr 15 2008, 22:57:26)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 0.1
0.10000000000000001
>>>
Sie werden wirklich vorsichtig mit Gleichheit Tests mit Schwimmern und verdoppelt sein wollen, in welcher Sprache Sie sind in
(Für Ihr Beispiel ist 0.2 eine andere dieser lästigen Zahlen, die nicht in IEEE-Binärdateien gespeichert werden können, aber solange Sie Ungleichheiten statt Gleichheiten testen, wie p < = 0.2, dann sind Sie in Ordnung .)
Ich denke, was Sie wirklich brauchen, ist dies: [Was jeder Informatiker Über Gleitkommaarithmetik wissen sollten] (http://docs.sun.com/source/ 806-3568/ncg_goldberg.html). – Patrick
Lesen Sie diese: http://blog.frama-c.com/index.php?post/2013/05/02/nearbyintf1 –
Siehe einfaches Java-Beispiel, sollte in C identisch sein: http://stackoverflow.com/ a/15790782/254109 – xmedeko