Archive for March, 2011
PHP и Java зависают при вводе цифрового значения 2.2250738585072011e-308
Posted by Grigori in Securitate Web on March 3, 2011
Было замечено, что php уходит в бесконечный цикл
$d = 2.2250738585072011e-308;
(То же самое происходит и при вводе значения целиком, 324 знака)
При этом, если использовать значение, как строковое, то проблем не происходит:
$d = '2.2250738585072011e-308'; echo $d;
Но стоит попытаться преобразовать его в цифру, сразу же возникают проблемы:
$d = '2.2250738585072011e-308'; echo $d + 0;
В чём же проблема? Число 2.2250738585072011e-308 представляет собой наибольшее число двойной точности с плавающей запятой. В шестнадцатеричной нотации оно выглядит так: 0×0.fffffffffffffp-1022. При этом, 2.2250738585072011e-308 одно из пяти чисел, которые корректно конвертируются в 0×0.fffffffffffffp-1022:
- 2.2250738585072007e-308
- 2.2250738585072008e-308
- 2.2250738585072009e-308
- 2.2250738585072010e-308
- 2.2250738585072011e-308
Но только 2.2250738585072011e-308 вызывает вышеописанные проблемы.
На данный момент, баг уже исправлен.
Подобный баг наблюдается и в Java. Данный код “повесит” компилятор:
class compilehang { public static void main(String[] args) { double d = 2.2250738585072012e-308; System.out.println("Value: " + d); } }
А вот этот фрагмент “повесит” программу во время исполнения:
class runhang { public static void main(String[] args) { System.out.println("Test:"); double d = Double.parseDouble("2.2250738585072012e-308"); System.out.println("Value: " + d); } }
Источник:
Exploringbinary
Be safe.