Відповідь на це "напрочуд" проста:
По- перше - як і більшість з вас , можливо , знаєте - це 32-розрядний ціле число знаходиться в діапазоні від -2147483648 до 2147483647 . Отже, що станеться, якщо PHP отримає результат, тобто ВЕЛИЧЕ, ніж це?
Зазвичай можна очікувати негайного "переповнення", в результаті чого 2,147,483,647 + 1 перетвориться на −2,147,483,648 . Однак це НЕ так. Якщо PHP зустрічається з більшою кількістю, він повертає FLOAT замість INT.
Якщо PHP зустрічає число, що виходить за межі цілого типу, воно буде інтерпретуватися як плаваючий. Також операція, в результаті якої число виходить за межі цілого типу, замість цього поверне плавець.
http://php.net/manual/en/language.types.integer.php
Це говорить, і знаючи, що реалізація PHP FLOAT слідує за формою подвійної точності IEEE 754, означає, що PHP може працювати з числами до 52 біт, не втрачаючи точності. (Для 32-бітної системи)
Отже, у Точці, де ваша сума сягає 9,007,199,254,740,992 (що становить 2 ^ 53 ) Значення Float, повернене математикою PHP, вже не буде достатньо точним.
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
Цей приклад показує точку, де PHP втрачає точність. По-перше, останній bititat біт буде скинутий, що призведе до того, що перші 2 вирази призводять до рівного числа - чого вони не є.
Із ЗАРАЗУ вся математика піде не так під час роботи з типами даних за замовчуванням.
• Чи така ж проблема в інших інтерпретованих мовах, таких як Python чи Perl?
Я не думаю, що так. Я думаю, що це проблема мов, які не мають безпеки типу. Хоча переповнення цілого числа, як згадувалося вище, відбуватиметься на будь-якій мові, що використовує фіксовані типи даних, мови без безпеки типу можуть спробувати вирішити це за допомогою інших типів даних. Однак, як тільки вони потраплять на "природний" (заданий Системою) кордон - вони можуть повернути що завгодно, але правильний результат.
Однак кожна мова може мати різні потоки для такого сценарію.