Niezbyt specyficzne dla implementacji Pythona, ale powinno mieć zastosowanie do wszystkich funkcji typu float do dziesiętnych funkcji łańcuchowych.
Liczba zmiennoprzecinkowa jest zasadniczo liczbą binarną, ale w notacji naukowej z ustalonym limitem cyfr znaczących.
Odwrotność dowolnej liczby, która ma współczynnik liczby pierwszej, który nie jest dzielony z podstawą, zawsze spowoduje powtarzającą się reprezentację kropki. Na przykład 1/7 ma czynnik pierwszy, 7, który nie jest dzielony z 10, a zatem ma powtarzającą się reprezentację dziesiętną, i to samo dotyczy 1/10 z czynnikami pierwszymi 2 i 5, które nie są dzielone z 2 ; oznacza to, że 0,1 nie może być dokładnie reprezentowane przez skończoną liczbę bitów po kropce.
Ponieważ 0.1 nie ma dokładnej reprezentacji, funkcja, która konwertuje przybliżenie na ciąg przecinka dziesiętnego, zwykle próbuje aproksymować pewne wartości, aby nie uzyskać nieintuicyjnych wyników, takich jak 0,1000000000004121.
Ponieważ liczba zmiennoprzecinkowa jest zapisana w notacji naukowej, mnożenie przez potęgę podstawy wpływa tylko na wykładnik liczby. Na przykład 1,231e + 2 * 100 = 1,231e + 4 dla notacji dziesiętnej i podobnie 1,00101010e11 * 100 = 1,00101010e101 w notacji binarnej. Jeśli pomnożę przez nie potęgę podstawy, wpłynie to również na cyfry znaczące. Na przykład 1,2e1 * 3 = 3,6e1
W zależności od zastosowanego algorytmu może próbować odgadnąć typowe liczby dziesiętne na podstawie tylko cyfr znaczących. Zarówno 0,1, jak i 0,4 mają te same cyfry znaczące w systemie dwójkowym, ponieważ ich liczby zmiennoprzecinkowe są zasadniczo obcięciami odpowiednio (8/5) (2 ^ -4) i (8/5) (2 ^ -6). Jeśli algorytm zidentyfikuje wzorzec sigfig 8/5 jako dziesiętną 1,6, to będzie działał na 0,1, 0,2, 0,4, 0,8 itd. Może również mieć magiczne wzorce sigfig dla innych kombinacji, takich jak liczba zmiennoprzecinkowa 3 podzielona przez liczbę zmiennoprzecinkową 10 i inne magiczne wzorce, które statystycznie prawdopodobnie zostaną utworzone przez podzielenie przez 10.
W przypadku 3 * 0,1 kilka ostatnich cyfr znaczących prawdopodobnie będzie się różnić od dzielenia liczby zmiennoprzecinkowej 3 przez liczbę zmiennoprzecinkową 10, co spowoduje, że algorytm nie rozpozna magicznej liczby dla stałej 0,3 w zależności od tolerancji utraty precyzji.
Edycja:
https://docs.python.org/3.1/tutorial/floatingpoint.html
Co ciekawe, istnieje wiele różnych liczb dziesiętnych, które mają ten sam najbliższy ułamek dwójkowy. Na przykład liczby 0,1 i 0,10000000000000001 i 0,1000000000000000055511151231257827021181583404541015625 są wszystkie w przybliżeniu przybliżone przez 3602879701896397/2 ** 55. Ponieważ wszystkie te wartości dziesiętne mają to samo przybliżenie, każda z nich może zostać wyświetlona przy jednoczesnym zachowaniu odwrotnej (odwrotnej) ) == x.
Nie ma tolerancji dla utraty precyzji, jeśli float x (0,3) nie jest dokładnie równe float y (0,1 * 3), to repr (x) nie jest dokładnie równe repr (y).