21

В классе Math присутствует метод:

 public static long round(double a) {
    if (a != 0x1.fffffffffffffp-2) // greatest double value less than 0.5
        return (long)floor(a + 0.5d);
    else
        return 0;
}

Подскажите пожалуйста что это за число такое 0x1.fffffffffffffp-2. Никак не пойму :)

Deleted
  • 371
wwvv
  • 1,312

1 Answers1

22

Это представленное в шестнадцатиричном виде число 0.49999999999999994 - самое большое число меньшее 0.5, которое может представить Java. 0x1.fffffffffffff - это 1.9999999999999998 в шестнадцатеричном виде. p-2 означает, что оно умножено на 2^-2 = 0.25 т. е. разделено на 4. Это как экспонента (например, 1.23e-5), только для шестнадцатеричных чисел.

fori1ton
  • 23,403
  • Но почему они сразу не написали 0.49999999999999994 для меня остается загадкой )) – wwvv Jan 27 '13 at 20:16
  • 2
    @wwvv: потому, что внутреннее представление чисел с плавающей точкой — шестнадцатеричное. Десятичные дроби в общем случае не могут быть точно представлены. Вследствие этого 0.49999999999999994неточное представление числа, а 0x1.fffffffffffffp-2 — точное. Используя неточное представление, вы должны задумываться, в какую сторону оно округлится (и об этом же должны задумываться все, кто читает код). Кроме того, из внешнего вида точного представления сразу понятно, откуда оно взялось: это «предшествующее» число для 0x2p-2 == 0х1p-1 == 1/16. – VladD May 29 '13 at 11:33