Dlaczego 0,1 + 0,2 nie jest dokładnie 0,3
Najbardziej znana „niespodzianka”
Jedno z najsłynniejszych „niespodzianek”
print(0.1 + 0.2)
0.30000000000000004
Prosta analogia: 1/3 w zapisie dziesiętnym
W systemie dziesiętnym 1/3 nie można zapisać jako liczba skończona
Tylko liczby 0.333333..., bez końca. Nie dlatego, że
System dziesiętny jest „zły”
Komputer w systemie binarnym ma dokładnie ten sam problem, tylko z innymi liczbami.
0.1 w zapisie dziesiętnym wygląda „prosto” — ale w systemie binarnym
zamienia się w nieskończenie powtarzającą się ułamek, dokładnie jak 1/3
w systemie dziesiętnym. Komputer jest zmuszony przyciąć go do skończonej liczby bitów — stąd ten mały
błąd.
Co dzieje się głębiej
Na większości nowoczesnych komputerów i w standardowym CPython
float spełnia format sprzętowy o podwójnej precyzji,
znany jako binary64 (część standardu IEEE 754). Koncepcyjnie liczba
jest przechowywana w trzech częściach:
Python może pokazać dokładną wartość zapisaną
Dobrą wiadomością jest to, że podejście nie jest przypadkowe ani tajemnicze – Python może Ci pokazać, Co dokładnie jest przechowywane:
print((0.1).as_integer_ratio())
# (3602879701896397, 36028797018963968) to dokładny ułamek, który faktycznie jest przechowywany
print((0.1).hex())
# '0x1.999999999999ap-4' to dokładna reprezentacja w formie szesnastkowej