2013-07-06 31 views

Odpowiedz

11

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

+0

Dzięki! Cieszę się, że zapytałem. –

Powiązane problemy