с плавающей запятой — PHP: ограничения при подсчете со значениями с плавающей запятой

Мне нужно посчитать числа, но я должен использовать тип данных с плавающей точкой (почему бы и нет — это встроенная система).

Простой счетчик выглядит так:

$num=1.0;
do {
$num = $num + 1;
// do some stuff
// ...
} while (...);

Вопрос 1: Какое наибольшее число можно правильно посчитать, используя 32-битную и 64-битную систему PHP?

Вопрос 2: Когда $num читается из базы данных MySQL с использованием стандартного типа FLOAT (точность не указана) в начале цикла и сохраняется в конце цикла, является ли ответ на вопрос 1 все еще действительным?

0

Решение

PHP использует двойную точность с плавающей запятой, которая имеет 52-битную мантиссу. Это означает, что целые числа, представленные с помощью чисел с плавающей точкой, начинают терять точность, когда достигают 253 (дополнительный бит точности связан с тем, что ведущий бит нормализованной мантиссы всегда равен 1, поэтому его не нужно явно включать в представление). Следующий пример демонстрирует это:

echo number_format(pow(2.0, 53)-1) . "<br>" .
number_format(pow(2.0, 53)) . "<br>" .
number_format(pow(2.0, 53)+1);

выходы:

9,007,199,254,740,991
9,007,199,254,740,992
9,007,199,254,740,992

Чтобы получить эквивалентную точность с плавающей точкой в ​​MySQL, вы должны использовать DOUBLE тип данных, который является 64-битной плавающей точкой. Если вы просто используете FLOAT вы получите 32-битную одинарную точность, которая имеет только 23 бита мантиссы, и потеряет целочисленную точность в 16,777,216.

Увидеть FLOAT и DOUBLE Представление типов данных для получения более подробной информации о том, как MySQL хранит плавающей запятой внутри.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]