Na przykład, 2.0**53 == 2.0**53 + 1
zwraca True
. Rozumiem, że jest to coś związanego z reprezentacją liczb swobodnych, ale czy ktoś może to wyjaśnić?
Odpowiedzi:
2 dla odpowiedzi № 1W liczbie zmiennoprzecinkowej jest tylko tyle bitów precyzji. Dla Pythona float
(znany również jako "double"), liczba ta wynosi 53. Bit wymagany do zapisania 1 w twoim przykładzie jest tuż poza końcem, więc zostaje upuszczony. (W rzeczywistości zaokrągla, więc czasami zaokrągla się: 2.**53+3==2.**53+4
.)
1 dla odpowiedzi nr 2
Prosty float
nie ma wystarczającej dokładności, aby przedstawić różnicę 1 między dwiema liczbami tej wielkości. Możesz samemu sprawdzić granice, jeśli chcesz: napisać pętlę do przetestowania 2.0**N == 2.0**N + 1
dla wartości N
w range(16, 55)
. Dowiesz się, ile jest dokładnych bitów float
.
Aby uzyskać zabawny wynik, spróbuj dodać od 1 do 2.0 ** 53 razy. Zobaczysz, jak wartość nie zmienia się wraz z małymi przyrostami.