Мне нужно посчитать числа, но я должен использовать тип данных с плавающей точкой (почему бы и нет — это встроенная система).
Простой счетчик выглядит так:
$num=1.0;
do {
$num = $num + 1;
// do some stuff
// ...
} while (...);
Вопрос 1: Какое наибольшее число можно правильно посчитать, используя 32-битную и 64-битную систему PHP?
Вопрос 2: Когда $num
читается из базы данных MySQL с использованием стандартного типа FLOAT (точность не указана) в начале цикла и сохраняется в конце цикла, является ли ответ на вопрос 1 все еще действительным?
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 хранит плавающей запятой внутри.
Других решений пока нет …