/ / Niezrozumiałe równości liczb zmiennoprzecinkowych [duplicate] - python, zmiennoprzecinkowe

Nieintuicyjne równości między liczbami zmiennymi [duplicate] - python, zmiennoprzecinkowe

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 № 1

W 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.