Pregunta : ¿Cómo calcular la JVM la suma de dos NaNs de doble precisión?
Detalles: El IEEE 754 especificación se reserva dos gamas de patrones de bits para NaNs:
0x7ff0000000000001 -> 0x7fffffffffffffff
y
0xfff0000000000001 -> 0xffffffffffffffff.
IEEE 754 requiere la suma de dos NaNs ser un NaN, pero, por lo que yo puedo decir, no dice nada sobre los detalles de implementación. Por lo tanto, para llegar a mi pregunta: Si escribimos b(x)
para el patrón de bits hexadecimal de un NaN x
, me gustaría saber: ¿Cómo funciona el cálculo JVM b(x + y)
desde b(x)
y b(y)?
jugando con un poco de código, estoy llevan a creer:
Reclamar : Let t = 0x0008000000000000
. Si b(y) + t
está en un rango NaN válido, entonces:
b(x + y) = b(y) + t
de otra manera,
b(x + y) = b(y).
Esto parece extraño para mí, y me gustaría saber más. Para que conste, estoy usando Java 8 en una MacBook i7 de Intel (en el caso de la versión de Java o la materia de hardware físico.) He aquí dos ejemplos:
Ejemplo 1, donde b(x + y) = b(y):
b(x) = 0x7fffddee0f43e7d4
b(y) = 0xfffaeaba08397e4e
b(x + y) = 0xfffaeaba08397e4e
Ejemplo 2, donde b(x + y) = b(y) + t:
b(x) = 0xffff4f0202031106
b(y) = 0xfff79342c97104ff
b(x + y) = 0xffff9342c97104ff
¿Alguien sabe cómo la suma está siendo evaluada por la JVM?
¡Gracias!
Para coma flotante, la mayoría de las implementaciones se basan simplemente en lo que hace el hardware subyacente. Suponiendo que se está ejecutando esto en algún tipo de arquitectura x86, Acá las reglas: (Usted puede encontrar esto en la Sección 4.8.3.5 de https://software.intel.com/sites/default/files/managed/39 /c5/325462-sdm-vol-1-2abcd-3abcd.pdf ):