Каковы другие значения NaN?

Документация для java.lang.Double.NaN говорит, что это

Постоянное содержание значение Не-числа (NaN) типа double. Это эквивалентно значению, возвращенному Double.longBitsToDouble(0x7ff8000000000000L).

Это, кажется, подразумевает, что существуют другие. Если так, как я овладеваю ими, и это может быть сделано портативно?

Чтобы быть ясным, я хотел бы найти double значения x таким образом, что

Double.doubleToRawLongBits(x) != Double.doubleToRawLongBits(Double.NaN)

и

Double.isNaN(x)

оба верны.

9
задан Kevin J. Chase 30 March 2017 в 22:59
поделиться

3 ответа

Хорошо, ОП говорил о желании узнать о переполнении стека и арифметическим переполнением, а также их соответствующим подведем. Вот идет ....

  1. Арифметический переполнение происходит, когда число становится слишком большим, чтобы соответствовать его типу значения. Например, INT содержит значения между -2 31 и 2 31 -1, включительно. Если ваш номер пройдет через эти ограничения, возникает переполнение, а число «Обертывает». Это не вызывает генерировать исключение в Java.
  2. Арифметический поток происходит, когда число плавающего точка становится слишком маленьким, чтобы очень хорошо отличить от нуля (точность числа усечена). В Java это также не вызывает исключения.
  3. Переполнение стека происходит при вызове функции, которая вызывает другую функцию, то тогда вызовет другое, то другое ... и стек вызова функции становится слишком глубоким. Вы получаете StackoverFeroror , когда это произойдет.
  4. Подолевание стека не происходит в Java. Предполагается, что его система выполнения предотвращает происходящее.

Чтобы ответить на другой вопрос ОП (см. Комментарии), когда вы завышете границы массива, выпускается IndexOutoFBoundsexception .

-121--2498548-

Вам нужно DoubletorAwlongbits , а не Doubletolongbits .

DoubletorAwlongbits извлекает фактическое двоичное представление. Doubletolongbits не преобразует все NAN для по умолчанию 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
9
ответ дан 4 December 2019 в 11:05
поделиться

Java использует IEEE 754 для своих чисел с плавающей точкой и поэтому следует их правилам.

В соответствии со страницей Википедии на NaN определяется так:

Битовый пример стандарта IEEE с плавающей точкой единой точности NaN: x111 1111 1axx xxxx xxxx xxxx xxxx , где x означает , не волнует .

Таким образом, существует довольно много битовых моделей, все из которых являются значениями NaN.

7
ответ дан 4 December 2019 в 11:05
поделиться

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 в экспоненте и Mantissa! = 0).

3
ответ дан 4 December 2019 в 11:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: