Каковы другие ценности NAN?
-
23-09-2019 - |
Вопрос
А Документация для java.lang.Double.NaN
говорит, что это
Постоянное удержание не наносимого значения типа (NAN)
double
. Анкет Это эквивалентно значению, возвращаемомуDouble.longBitsToDouble(0x7ff8000000000000L)
.
Это, кажется, подразумевает, что есть и другие. Если да, то как мне завладеть их, и можно ли это сделать портативно?
Чтобы быть ясным, я хотел бы найти double
ценности x
так что
Double.doubleToRawLongBits(x) != Double.doubleToRawLongBits(Double.NaN)
а также
Double.isNaN(x)
оба верны.
Решение
Тебе нужно doubleToRawLongBits
скорее, чем doubleToLongBits
.
doubleToRawLongBits
Извлекает фактическое двоичное представление. doubleToLongBits
нет, это преобразует все NaN
s по умолчанию NaN
первый.
double n = Double.longBitsToDouble(0x7ff8000000000000L); // default NaN
double n2 = Double.longBitsToDouble(0x7ff8000000000100L); // also a NaN, but M != 0
System.out.printf("%X\n", Double.doubleToLongBits(n));
System.out.printf("%X\n", Double.doubleToRawLongBits(n));
System.out.printf("%X\n", Double.doubleToLongBits(n2));
System.out.printf("%X\n", Double.doubleToRawLongBits(n2));
выход:
7FF8000000000000
7FF8000000000000
7FF8000000000000
7FF8000000000100
Другие советы
Java использует IEEE 754 по номерам его плавающих пунктов и, следовательно, следует их правилам.
Согласно Страница Википедии на Нэн это определено так:
Попутный пример IEEE с плавающей точкой стандартной точки с плавающей точкой.
x111 1111 1axx xxxx xxxx xxxx xxxx xxxx
кудаx
означает не волнует.
Так что есть довольно много битовых паттернов, все из которых NaN
ценности.
IEEE 754 определяет NAN как число со всеми битами для экспонентов, которые 1
и не нулевое число в мантиссе.
Итак, для одного номера, который вы ищете:
S E M
x 11111111 xxxxxx....xxx (with M != 0)
Java обрабатывает это так:
Double n = Double.longBitsToDouble(0x7ff8000000000000L); // default NaN
Double n2 = Double.longBitsToDouble(0x7ff8000000000100L); // also a NaN, but M != 0
System.out.println(n.isNaN()); // true
System.out.println(n2.isNaN()); // true
System.out.println(n2 != Double.doubleToLongBits(Double.NaN)); // true
Подводя итог, вы можете использовать любой NAN, который вы хотите, что соответствует вышеупомянутым правилам (все биты 1 в Exponent и Mantissa! = 0).