La respuesta a esto es "sorprendentemente" simple:
Primero, como la mayoría de ustedes saben, un número entero de 32 bits oscila entre −2,147,483,648 y 2,147,483,647 . Entonces, ¿qué sucede si PHP obtiene un resultado, que es MÁS GRANDE que esto?
Por lo general, uno esperaría un "Desbordamiento" inmediato, que hace que 2,147,483,647 + 1 se convierta en −2,147,483,648 . Sin embargo, este no es el caso. SI PHP encuentra un número mayor, devuelve FLOAT en lugar de INT.
Si PHP encuentra un número más allá de los límites del tipo entero, se interpretará como un flotante. Además, una operación que resulta en un número más allá de los límites del tipo entero devolverá un flotante.
http://php.net/manual/en/language.types.integer.php
Dicho esto, y sabiendo que la implementación de PHP FLOAT sigue el formato de doble precisión IEEE 754, significa que PHP puede manejar números de hasta 52 bits, sin perder precisión. (En un sistema de 32 bits)
Entonces, en el punto, donde su suma llega a 9,007,199,254,740,992 (que es 2 ^ 53 ) El valor Float devuelto por PHP Maths ya no será lo suficientemente preciso.
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
Este ejemplo muestra el punto, donde PHP está perdiendo precisión. Primero, el último bit de significación se descartará, lo que provocará que las 2 primeras expresiones den como resultado un número igual, que no lo son.
A partir de AHORA, toda la matemática saldrá mal cuando trabaje con tipos de datos predeterminados.
• ¿Es el mismo problema para otro lenguaje interpretado como Python o Perl?
No lo creo. Creo que este es un problema de idiomas que no tienen seguridad de escritura. Si bien se producirá un desbordamiento de enteros como se mencionó anteriormente en todos los idiomas que usan tipos de datos fijos, los idiomas sin seguridad de tipo podrían intentar detectar esto con otros tipos de datos. Sin embargo, una vez que alcanzan su frontera "natural" (dada por el sistema), pueden devolver cualquier cosa, pero el resultado correcto.
Sin embargo, cada idioma puede tener diferentes hilos para tal escenario.