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 por Double.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.

¿Fue útil?

Solución

Necesitas doubleToRawLongBits más bien que doubleToLongBits.

doubleToRawLongBits extrae la representación binaria real. doubleToLongBits no, convierte todo NaNS 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ónde x 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).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top