Archive for March, 2011

PHP и Java зависают при вводе цифрового значения 2.2250738585072011e-308

Было замечено, что 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.

, ,

No Comments