Вопрос

А Документация для 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 нет, это преобразует все NaNs по умолчанию 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).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top