Документация для java.lang.Double.NaN
говорит, что это
Постоянное содержание значение Не-числа (NaN) типа
double
. Это эквивалентно значению, возвращенномуDouble.longBitsToDouble(0x7ff8000000000000L)
.
Это, кажется, подразумевает, что существуют другие. Если так, как я овладеваю ими, и это может быть сделано портативно?
Чтобы быть ясным, я хотел бы найти double
значения x
таким образом, что
Double.doubleToRawLongBits(x) != Double.doubleToRawLongBits(Double.NaN)
и
Double.isNaN(x)
оба верны.
Хорошо, ОП говорил о желании узнать о переполнении стека и арифметическим переполнением, а также их соответствующим подведем. Вот идет ....
INT
содержит значения между -2 31 и 2 31 -1, включительно. Если ваш номер пройдет через эти ограничения, возникает переполнение, а число «Обертывает». Это не вызывает генерировать исключение в Java. StackoverFeroror
, когда это произойдет. Чтобы ответить на другой вопрос ОП (см. Комментарии), когда вы завышете границы массива, выпускается IndexOutoFBoundsexception
.
Вам нужно 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
Java использует IEEE 754 для своих чисел с плавающей точкой и поэтому следует их правилам.
В соответствии со страницей Википедии на NaN определяется так:
Битовый пример стандарта IEEE с плавающей точкой единой точности NaN:
x111 1111 1axx 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 в экспоненте и Mantissa! = 0).