W typowych implementacjach zmiennoprzecinkowych wynik pojedynczej operacji jest generowany tak, jakby operacja została wykonana z nieskończoną precyzją, a następnie zaokrąglana do najbliższej liczby zmiennoprzecinkowej.
Porównaj i b + a : Wynik każdej operacji wykonanej z nieskończoną precyzją jest taki sam, dlatego te same wyniki nieskończonej precyzji są zaokrąglane w identyczny sposób. Innymi słowy, dodawanie zmiennoprzecinkowe jest przemienne.a+bb+a
Weź : b jest liczbą zmiennoprzecinkową. W przypadku binarnych liczb zmiennoprzecinkowych 2 b jest także liczbą zmiennoprzecinkową (wykładnik jest większy o jeden), więc b + b jest dodawane bez żadnego błędu zaokrąglania. Następnie dodaje się do dokładnej wartości b + B . Wynikiem jest dokładna wartość 2 b + a , zaokrąglona do najbliższej liczby zmiennoprzecinkowej.b+b+ab2bb+bab+b2 b + a
Weź : dodaje się a + b , a wystąpi błąd zaokrąglenia r , więc otrzymamy wynik a + b + r . Dodaj b , a wynikiem będzie dokładna wartość 2 b + a + r , zaokrąglona do najbliższej liczby zmiennoprzecinkowej.a + b + ba + bra + b + rb2 b + a + r
Tak więc w jednym przypadku , zaokrąglone. W drugim przypadku 2 b + a + r , zaokrąglone.2 b + a2 b + a + r
PS. To, czy dla dwóch konkretnych liczb i b oba obliczenia dadzą ten sam wynik, czy nie, zależy od liczb i błędu zaokrąglenia w obliczeniach a + b i jest zwykle trudne do przewidzenia. Zastosowanie pojedynczej lub podwójnej precyzji zasadniczo nie ma znaczenia dla problemu, ale ponieważ błędy zaokrąglania są różne, pojawią się wartości aib, gdzie w pojedynczej precyzji wyniki są równe, a w podwójnej precyzji nie są, lub odwrotnie. Precyzja będzie znacznie wyższa, ale problem polegający na tym, że dwa wyrażenia są matematycznie takie same, ale nie takie same w arytmetyki zmiennoprzecinkowej, pozostaje ten sam.zaba + b
PPS. W niektórych językach arytmetykę zmiennoprzecinkową można wykonywać z większą precyzją lub z większym zakresem liczb niż podane w rzeczywistych instrukcjach. W takim przypadku znacznie bardziej prawdopodobne (ale nadal nie jest to gwarantowane), że obie sumy dają ten sam wynik.
PPPS. W komentarzu zapytano, czy powinniśmy zapytać, czy liczby zmiennoprzecinkowe są równe, czy nie. Absolutnie, jeśli wiesz, co robisz. Na przykład, jeśli posortujesz tablicę lub zaimplementujesz zestaw, wpadniesz w straszne kłopoty, jeśli chcesz użyć pojęcia „w przybliżeniu równego”. W graficznym interfejsie użytkownika może być konieczne ponowne obliczenie rozmiarów obiektu, jeśli rozmiar obiektu się zmienił - porównujesz oldSize == newSize, aby uniknąć tego ponownego obliczenia, wiedząc, że w praktyce prawie nigdy nie masz prawie identycznych rozmiarów, a twój program jest poprawny nawet jeśli nastąpi niepotrzebne przeliczenie.