float java math floating-point ieee-754

float - ¿Por qué la raíz cuadrada de-Infinity+Infinity en Java?



ieee 754 converter (2)

Esta pregunta ya tiene una respuesta aquí:

Intenté dos formas diferentes de encontrar la raíz cuadrada en Java:

Math.sqrt(Double.NEGATIVE_INFINITY); // NaN Math.pow(Double.NEGATIVE_INFINITY, 0.5); // Infinity

¿Por qué la segunda vía no devuelve la respuesta esperada que es NaN (igual que con la primera)?


Se devuelve un NaN (bajo IEEE 754) para continuar un cálculo cuando se ha obtenido un resultado verdaderamente indefinido (intermedio). Se devuelve un infinito para continuar un cálculo después de que se ha producido un desbordamiento.

Por lo tanto, el comportamiento

Math.sqrt(Double.NEGATIVE_INFINITY); // NaN

se especifica porque se sabe (fácil y rápidamente ) que se ha generado un valor indefinido; basado únicamente en el signo del argumento.

Sin embargo, la evaluación de la expresión

Math.pow(Double.NEGATIVE_INFINITY, 0.5); // Infinity

encuentra un desbordamiento Y una operación no válida. Sin embargo, el reconocimiento de operación no válida depende críticamente de cuán precisa es la determinación del segundo argumento. Si el segundo argumento es el resultado de una operación de redondeo anterior, entonces puede no ser exactamente 0.5. Por lo tanto, se devuelve la determinación menos grave, el reconocimiento de un desbordamiento, para evitar la dependencia crítica del resultado con la precisión del segundo argumento.

Detalles adicionales sobre algunos de los razonamientos detrás de la norma IEEE 754, incluido el razonamiento detrás de devolver los valores de bandera en lugar de generar excepciones, están disponibles en

Lo que todo informático debería saber sobre la aritmética de coma flotante (1991, David Goldberg) ,

que es el Apéndice D de

Guía de computación numérica de Sun Microsystems .


Simplemente está actuando como se describe en la documentation de Math .

Para Math.sqrt :

Si el argumento es NaN o menor que cero, entonces el resultado es NaN.

Para Math.pow :

Si

  • el primer argumento es cero negativo y el segundo argumento es menor que cero, pero no es un entero impar finito, o
  • el primer argumento es infinito negativo y el segundo argumento es mayor que cero pero no es un entero impar finito,

entonces el resultado es infinito positivo.

En cuanto a por qué hicieron esa elección de diseño, tendrás que preguntarle a los autores de java.