Quantcast
Channel: Все публикации подряд на Хабре
Viewing all articles
Browse latest Browse all 117291

JAVA / [Перевод] Java зависает на 2.2250738585072012e-308

$
0
0
Константин Прайссер (Konstantin Preisser) недавно обнаружил нечто весьма любопытное: Java — и рантайм и компилятор — входит в бесконечный цикл при конвертации десятичного 2.2250738585072012e-308 в double. По идее, число должно быть преобразовано в 0x1p-1022, то есть Double.MIN_VALUE. Однако, Java зависает на 0x0.fffffffffffffp-1022, самом большом денормализованном числе для double.

Бесконечный цикл в runtime

class RuntimeHang {
    public static void main(String[] args) {
        System.out.println("Test:");
        double d = Double.parseDouble("2.2250738585072012e-308");
        System.out.println("Value: " + d);
    }
}


Бесконечный цикл во время компиляции


(Если вы хотите опробовать это в Eclipse, не забудьте сначала всё сохранить, а то с его теневой компиляцией и опомниться не успеете — прим. перев.)
class CompilationHang {
    public static void main(String[] args) {
        double d = 2.2250738585072012e-308;
        System.out.println("Value: " + d);
    }
}

Под катом рассуждения автора насчёт причин этого явления.

Viewing all articles
Browse latest Browse all 117291

Trending Articles