¿Por qué es la raíz cuadrada de-Infinity +Infinity en Java? [duplicar]


Esta pregunta ya tiene una respuesta aquí:

Probé 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 vía)?

Author: Mark Dickinson, 2017-12-29

2 answers

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

Así el comportamiento

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

Se especifica porque se conoce (fácilmente y rápidamente) que se ha generado un valor indefinido; basado únicamente en el signo de la argumento.

Sin embargo evaluación de la expresión

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

Encuentra tanto un desbordamiento COMO una operación no válida. Sin embargo, el reconocimiento de la operación inválida depende críticamente de cuán precisa sea 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. Así, la determinación menos grave, el reconocimiento de un desbordamiento, se devuelve con el fin de evitar la dependencia crítica de el resultado de la precisión del segundo argumento.

Los detalles adicionales sobre algunos de los argumentos detrás del estándar IEEE 754, incluido el razonamiento detrás de devolver valores de bandera en lugar de generar excepciones, están disponibles en

Lo Que Todo Científico De La Computación Debe Saber Sobre La Aritmética De Coma Flotante (1991, David Goldberg),

Que es el apéndice D de

Guía de Cálculo Numérico de Sun Microsystems.

 48
Author: Pieter Geerkens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-29 21:53:49

Simplemente está actuando como se describe en la documentación de Math.

Para Math.sqrt:

Si el argumento es NaN o menos 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 un entero impar finito, o
  • el primer argumento es infinito negativo y el segundo argumento es mayor que cero pero no una impar finita entero,

Entonces el resultado es infinito positivo.

En cuanto a por qué hicieron esa elección de diseño - usted tendrá que preguntar a los autores de java.

 30
Author: piet.t,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-29 15:21:09