A resposta para isso é "surpreendentemente" simples:
Primeiro - como muitos de vocês devem saber - um número inteiro de 32 bits varia de −2.147.483.648 a 2.147.483.647 . Então, o que acontece se o PHP obtiver um resultado, isso é MAIOR do que isso?
Normalmente, seria de esperar um "estouro" imediato, causando 2.147.483.647 + 1 se transformem em -2.147.483.648 . No entanto, esse não é o caso. SE o PHP encontrar um número maior, ele retornará FLOAT em vez de INT.
Se o PHP encontrar um número além dos limites do tipo inteiro, ele será interpretado como um float. Além disso, uma operação que resulta em um número além dos limites do tipo inteiro retornará uma flutuação.
http://php.net/manual/en/language.types.integer.php
Dito isto, e sabendo que a implementação do PHP FLOAT está seguindo o formato de precisão dupla IEEE 754, significa que o PHP é capaz de lidar com números de até 52 bits, sem perder a precisão. (Em um sistema de 32 bits)
Portanto, no ponto em que sua soma atinge 9.007.199.254.740.992 (que é 2 ^ 53 ) O valor Float retornado pelo PHP Maths não será mais preciso o suficiente.
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 exemplo mostra o ponto, onde o PHP está perdendo precisão. Primeiro, o último bit significativo será eliminado, fazendo com que as 2 primeiras expressões resultem em um número igual - o que não é.
A partir de agora, toda a matemática vai dar errado ao trabalhar com tipos de dados padrão.
• É o mesmo problema para outra linguagem interpretada, como Python ou Perl?
Acho que não. Eu acho que esse é um problema de idiomas que não têm segurança de tipo. Enquanto um Estouro Inteiro, como mencionado acima, ocorrerá em todos os idiomas que usam tipos de dados fixos, os idiomas sem segurança de tipo podem tentar capturar isso com outros tipos de dados. No entanto, uma vez que atingem sua fronteira "natural" (fornecida pelo sistema) - eles podem retornar qualquer coisa, mas o resultado certo.
No entanto, cada idioma pode ter encadeamentos diferentes para esse cenário.