isnan - nan java error solucion
¿Cuáles son las constantes de INFINITY en Java, realmente? (3)
Recientemente me encontré con las constantes en las clases de contenedor de tipo primitivo como Double.POSITIVE_INFINITY
y Double.NEGATIVE_INFINITY
. En la API, define el primero como:
Una constante que contiene el infinito positivo de tipo doble. Es igual al valor devuelto por Double.longBitsToDouble (0x7ff0000000000000L).
Los otros tienen definiciones a lo largo de estas mismas líneas.
Lo que estoy teniendo problemas es entender qué son realmente estas constantes. En realidad, no pueden ser ni representar infinitos positivos / negativos, porque el sistema es, por naturaleza, finito. ¿Es solo una configuración arbitraria de bits que los creadores de Java consideraron que definiría el concepto de infinito? ¿O tienen estos realmente algún tipo de valor especial? Si se trata simplemente de una cadena de bits arbitraria interpretada como un double
, ¿existe algún número normal que, cuando se interpreta como un double
, devuelva POSITIVE_INFINITY
lugar de cualquier valor que realmente se espere?
Perdónenme si la respuesta a esto es obvia dada la parte Double.longBitsToDouble(0x7ff0000000000000L)
de la API. A decir verdad, esa descripción es bastante arcana para mí y no voy a pretender entender lo que los valores hexadecimales realmente significan o representan.
De hecho, representan el infinito positivo y negativo, que son conceptos claramente definidos en el estándar de punto flotante IEEE . Por ejemplo, dividir un número de punto flotante positivo por cero produce un infinito positivo. En cuanto al patrón de bits en sí, es solo un patrón que se ha elegido para representar el infinito.
El punto flotante de Java se basa en el estándar de punto flotante estándar flotante IEEE 754, cuya primera versión se emitió aproximadamente en 1985, por lo que es mucho más antiguo que Java. Dada la amplia implementación de hardware de IEEE 754 en el momento en que se definía Java, los creadores de Java tenían pocas opciones.
Cada número de punto flotante IEEE 754 tiene tres componentes, un bit de signo, un exponente y una mantisa. Simplificando considerablemente, la magnitud de un número normal es:
mantissa * (2 ** exponent)
donde "**" representa poder.
El bit adelantado es el bit de signo. En dobles, los siguientes 11 bits son el exponente.
Los patrones de bits con todos los bits de exponente están reservados para infinitos y NaN. Todos los números normales tienen al menos un bit cero en el exponente. Los dos infinitos están representados por tener todos los bits de exponente activados, y todos los bits de mantisa son cero. El bit de signo inicial distingue el infinito positivo y negativo.
La elección de todos los bits de exponente uno para los casos especiales no es arbitraria. Es más fácil cortar uno de los extremos que lidiar con un hueco en el medio de un rango de números, especialmente para las implementaciones de hardware. Tomar el exponente de todos los bits fuera de casos especiales habría evitado la codificación cero con el patrón de todos los bits desactivados, y habría dado los mayores valores de magnitud absoluta, los infinitos, el exponente más pequeño, lo que también habría complicado el hardware. El exponente de todos los bits en definitivamente es la mejor opción para los infinitos.
Los dos infinitos se usan para representar dos cosas, en realidad resultados infinitos y resultados que son demasiado grandes en magnitud absoluta para representar en el sistema numérico normal, números mayores que Double.MAX_VALUE o menores que -Double.MAX_VALUE. 1.0 / 0.0 es infinito. Lo mismo ocurre con 2 * Double.MAX_VALUE.
Hay algunos algoritmos que se pueden simplificar, con menos casos especiales, permitiendo que los resultados intermedios sean infinitos, en cualquier sentido. Hacerlo también permite, por ejemplo, que incluso una línea paralela al eje y tenga un degradado almacenable que pueda usarse en los cálculos.
Los números de coma flotante del estándar 754 de IEEE :
"Los valores + infinito y -infinito se denotan con un exponente de todos los 1s y una fracción de todos los 0. El bit de signo distingue entre infinito negativo e infinito positivo. Ser capaz de denotar infinito como un valor específico es útil porque permite operaciones a continúe pasando por situaciones de desbordamiento. Las operaciones con valores infinitos están bien definidas en el punto flotante IEEE ".
Además: "Las operaciones en números especiales están bien definidas por IEEE. En el caso más simple, cualquier operación con un NaN produce un resultado NaN. Otras operaciones son las siguientes: "
Operation Result
n ÷ ±Infinity 0
±Infinity × ±Infinity ±Infinity
±nonzero ÷ 0 ±Infinity
Infinity + Infinity Infinity
±0 ÷ ±0 NaN
Infinity - Infinity NaN
±Infinity ÷ ±Infinity NaN
±Infinity × 0 NaN