Odpowiedź na to jest „zaskakująco” prosta:
Po pierwsze - jak większość z was może wiedzieć - 32-bitowa liczba całkowita wynosi od -2 147 483 648 do 2147 483 647 . Co się stanie, jeśli PHP otrzyma wynik, który jest WIĘKSZY niż ten?
Zwykle można się spodziewać natychmiastowego „przepełnienia”, powodując, że 2 147 483 647 + 1 zmienia się w -2 147 147 483 648 . Tak jednak nie jest. JEŻELI PHP napotyka większą liczbę, zwraca wartość FLOAT zamiast INT.
Jeśli PHP napotka liczbę przekraczającą granice liczby całkowitej, zostanie ona zinterpretowana jako liczba zmiennoprzecinkowa. Również operacja, w wyniku której liczba wykracza poza granice liczby całkowitej, zwróci liczbę zmiennoprzecinkową.
http://php.net/manual/en/language.types.integer.php
To powiedziawszy, i wiedząc, że implementacja PHP FLOAT jest zgodna z formatem podwójnej precyzji IEEE 754, oznacza, że PHP jest w stanie poradzić sobie z liczbami do 52 bitów, bez utraty precyzji. (W systemie 32-bitowym)
Tak więc w punkcie, w którym twoja suma osiągnie 9 007 199 254 440,992 (czyli 2 ^ 53 ) Wartość zmiennoprzecinkowa zwrócona przez matematykę PHP nie będzie już wystarczająco precyzyjna.
E:\PHP>php -r "$x=bindec(\"100000000000000000000000000000000000000000000000000000\"); echo number_format($x,0);"
9 007,199,254,740,992
E:\PHP>php -r "$x=bindec(\"100000000000000000000000000000000000000000000000000001\"); echo number_format($x,0);"
9 007,199,254,740,992
E:\PHP>php -r "$x=bindec(\"100000000000000000000000000000000000000000000000000010\"); echo number_format($x,0);"
9 007,199,254,740,994
Ten przykład pokazuje punkt, w którym PHP traci precyzję. Po pierwsze, ostatni znaczący bit zostanie usunięty, co spowoduje, że pierwsze 2 wyrażenia będą miały taką samą liczbę - co nie jest.
Od TERAZ cała matematyka pójdzie nie tak podczas pracy z domyślnymi typami danych.
• Czy to ten sam problem w przypadku innych interpretowanych języków, takich jak Python lub Perl?
Nie wydaje mi się Myślę, że jest to problem języków, które nie mają bezpieczeństwa typu. Podczas gdy przepełnienie liczb całkowitych, jak wspomniano powyżej, BĘDZIE występować w każdym języku, który używa stałych typów danych, języki bez bezpieczeństwa typu mogą próbować wychwycić to z innymi typami danych. Jednak po osiągnięciu „naturalnej” (podanej przez system) granicy - mogą zwrócić wszystko, ale właściwy wynik.
Jednak każdy język może mieć różne wątki dla takiego scenariusza.