¿Cuáles son los otros valores de NAN?
-
23-09-2019 - |
Pregunta
los documentación para java.lang.Double.NaN
dice que es
Un valor constante que tiene un valor de tipo no un número (nan)
double
. Es equivalente al valor devuelto porDouble.longBitsToDouble(0x7ff8000000000000L)
.
Esto parece implicar que hay otros. Si es así, ¿cómo los consigo y se puede hacer esto portátil?
Para ser claros, me gustaría encontrar el double
valores x
tal que
Double.doubleToRawLongBits(x) != Double.doubleToRawLongBits(Double.NaN)
y
Double.isNaN(x)
ambos son ciertos.
Solución
Necesitas doubleToRawLongBits
más bien que doubleToLongBits
.
doubleToRawLongBits
extrae la representación binaria real. doubleToLongBits
no, convierte todo NaN
S al valor predeterminado NaN
primero.
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));
producción:
7FF8000000000000
7FF8000000000000
7FF8000000000000
7FF8000000000100
Otros consejos
Java usa IEEE 754 por sus números de puntos flotantes y, por lo tanto, sigue sus reglas.
De acuerdo con la Página de Wikipedia en nan se define así:
Un ejemplo de un bit-wise de una nan de precisión de un solo punto flotante IEEE:
x111 1111 1axx xxxx xxxx xxxx xxxx xxxx
dóndex
medio no me importa.
Así que hay bastantes patrones de bits, todos los cuales son NaN
valores.
IEEE 754 define un nan como un número con todos los bits de exponentes que son 1
y un número no cero en la Mantissa.
Entonces, para un número de precisión única que está buscando:
S E M
x 11111111 xxxxxx....xxx (with M != 0)
Java maneja esto así:
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
Para sumar, puede usar cualquier nan que desee que se ajuste a las reglas antes mencionadas (todos los bits 1 en exponente y mantissa! = 0).