La réponse à cette question est "étonnamment" simple:
Tout d'abord - comme la plupart d'entre vous le savent peut-être - un entier 32 bits varie de −2 147 483 648 à 2 147 483 647 . Alors, que se passe-t-il si PHP obtient un résultat, c'est PLUS GRAND que cela?
Habituellement, on s'attendrait à un "débordement" immédiat, entraînant la conversion de 2 147 483 647 + 1 en −2 147 483 648 . Cependant, ce n'est pas le cas. SI PHP rencontre un plus grand nombre, il renvoie FLOAT au lieu de INT.
Si PHP rencontre un nombre au-delà des limites du type entier, il sera plutôt interprété comme un flottant. En outre, une opération qui aboutit à un nombre au-delà des limites du type entier retournera un flottant à la place.
http://php.net/manual/en/language.types.integer.php
Cela dit, et sachant que l'implémentation de PHP FLOAT suit le format double précision IEEE 754, cela signifie que PHP est capable de gérer des nombres jusqu'à 52 bits, sans perdre en précision. (Sur un système 32 bits)
Ainsi, au point où votre somme atteint 9 007 199 254 740 992 (ce qui est 2 ^ 53 ) La valeur flottante renvoyée par les mathématiques PHP ne sera plus assez précise.
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
Cet exemple montre le point, où PHP perd de sa précision. Tout d'abord, le dernier bit significatif sera supprimé, ce qui entraînera les 2 premières expressions à donner un nombre égal - ce qu'elles ne sont pas.
À partir de NOW ON, toutes les mathématiques iront mal, lorsque vous travaillez avec des types de données par défaut.
• Est-ce le même problème pour d'autres langages interprétés tels que Python ou Perl?
Je ne pense pas. Je pense que c'est un problème de langues qui n'ont aucune sécurité de type. Bien qu'un débordement d'entier comme mentionné ci-dessus se produise dans toutes les langues qui utilisent des types de données fixes, les langues sans sécurité de type peuvent essayer d'attraper cela avec d'autres types de données. Cependant, une fois qu'ils ont atteint leur frontière "naturelle" (donnée par le système) - ils pourraient retourner n'importe quoi, mais le bon résultat.
Cependant, chaque langue peut avoir des threads différents pour un tel scénario.