Pregunta ¿Cuáles son los otros valores de NaN?


los documentación para java.lang.Double.NaN dice que es

Una constante que contiene un valor Not-a-Number (NaN) de tipo double. Es equivalente al valor devuelto por Double.longBitsToDouble(0x7ff8000000000000L).

Esto parece implicar que hay otros. Si es así, ¿cómo puedo obtenerlos, y esto puede hacerse de forma portátil?

Para ser claro, me gustaría encontrar el double valores x tal que

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

y

Double.isNaN(x)

son ambos verdaderos


8
2018-01-28 12:36


origen


Respuestas:


Necesitas doubleToRawLongBits más bien que doubleToLongBits.

doubleToRawLongBits extrae la representación binaria real. doubleToLongBits  no, convierte todo NaNs al 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));

salida:

7FF8000000000000
7FF8000000000000
7FF8000000000000
7FF8000000000100

8
2018-01-28 13:54



Usos de Java IEEE 754 por sus números de coma flotante y por lo tanto sigue sus reglas.

De acuerdo con la Página de Wikipedia en NaN se define así:

Un ejemplo de bit-wise de un NaN de precisión simple estándar de punto flotante IEEE: x111 1111 1axx xxxx xxxx xxxx xxxx xxxx dónde x medio no me importa.

Entonces, hay bastantes patrones de bits, todos los cuales son NaN valores.


6
2018-01-28 12:40



IEEE 754 define un NaN como un número con todos los bits de exponente que son 1 y un número distinto de cero en la mantisa.

Entonces, para un número de precisión simple 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

En resumen, puede usar cualquier NaN que desee que cumpla con las reglas antes mencionadas (todos los bits 1 en exponente y mantissa! = 0).


2
2018-01-28 12:39



Preguntas populares