Dzieje się to na dowolnym numerze zmiennoprzecinkowym IEEE 754. Wynika to z natury reprezentacji zmiennoprzecinkowej. Każdy język korzystający z formatu IEEE 754 napotka na ten sam problem.
Od 1.0
może nie być reprezentowany dokładnie w systemie zmiennoprzecinkowym jako 1.000000000...
, dlatego uważane jest za niebezpieczne porównywanie ich za pomocą ==
. Liczby zmiennoprzecinkowe należy zawsze porównywać z wartością epsilon.
Ponieważ obliczenia zmiennoprzecinkowe wiążą się z pewną dozą niepewności, możemy spróbować na to pozwolić, sprawdzając, czy dwie liczby są "blisko" do siebie. Jeśli zdecydować - na podstawie analizy błędów, testowanie, czy dzikie przypuszczenie - że wynik powinien być zawsze w zasięgu 0,00001 oczekiwanego wyniku następnie można zmienić porównania do tego:
if (fabs(someFloat - 1.0)) < 0.00001)
Maksymalna wartość błędu jest zazwyczaj zwany epsilon.
Prawdopodobnie powinieneś przeczytać What Every Computer Scientist Should Know About Floating-Point Arithmetic
Dzięki! Cieszę się, że zapytałem. –