Zasadniczo błąd zmiennoprzecinkowy odnosi się do liczby, której nie można zapisać w reprezentacji zmiennoprzecinkowej IEEE.
Liczby całkowite są przechowywane z najbardziej na prawo wybranym bitem 1, a każdy bit po lewej jest podwójny (2,4,8, ...). Łatwo zauważyć, że może to przechowywać dowolną liczbę całkowitą do 2^n, gdzie n to liczba bitów.
Mantysa (część dziesiętna) liczby zmiennoprzecinkowej jest przechowywana w podobny sposób, ale porusza się od lewej do prawej, a każdy kolejny bit stanowi połowę wartości poprzedniej. (W rzeczywistości jest to trochę bardziej skomplikowane, ale na razie to zrobi).
W ten sposób liczby takie jak 0,5 (1/2) są łatwe do zapisania, ale nie każdy numer < 1 może być utworzony przez dodanie stałej liczby ułamków postaci 1/2, 1/4, 1/8, ...
Bardzo prostym przykładem jest 0,1 lub 1/10. Można to zrobić za pomocą nieskończonej serii (której nie da się naprawdę wyleczyć), ale gdy komputer przechowuje 0.1, to nie jest to dokładnie ta liczba, która jest przechowywana.
Jeśli masz dostęp do maszyny Unix, to łatwo zobaczyć.
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
>>>
Będziemy chcieli, aby być naprawdę ostrożny z testów równości z pływaków i deblu, w jakimkolwiek języku jesteś w
(Dla twojego przykładu, 0.2 to kolejna z tych brzydkich liczb, których nie można zapisać w pliku binarnym IEEE, ale dopóki testujesz nierówności, a nie równości, np. P < = 0.2, wszystko będzie w porządku .)
myślę, czego naprawdę potrzebujesz, to w ten sposób: [Co każdy komputer naukowiec powinien wiedzieć o arytmetyki zmiennoprzecinkowej] (http://docs.sun.com/source/ 806-3568/ncg_goldberg.html). – Patrick
Przeczytaj to: http://blog.frama-c.com/index.php?post/2013/05/02/nearbyintf1 –
Zobacz prosty przykład Java, shuld być taki sam w C: http://stackoverflow.com/ a/15790782/254109 – xmedeko