Un programa simple en lenguaje C genera -1.#IND00... No sé qué pasa.
Al programar números de punto flotante, si no prestas atención, a menudo aparecerán resultados extraños como 1.#IND, 1.#INF o nan, inf. Esto suele implicar una excepción para las operaciones de punto flotante.
El significado de los números especiales de punto flotante
1. #INF / inf: este valor representa "infinito (abreviatura de infinito)", es decir, excede el rango máximo de números de punto flotante que la computadora puede representar (en otras palabras, excede el valor máximo de tipo doble). Por ejemplo, al dividir un número entero entre 0, obtendrá un valor 1.#INF/inf; en consecuencia, si divide un número entero negativo entre 0, también obtendrá un valor -1.#INF/-inf.
-1.#IND/nan: La situación con este es más complicada, en general provienen de cualquier operación de punto flotante con resultado indefinido (ilegal). "IND" es la abreviatura de indeterminado y "nan" es la abreviatura de no un número. Ejemplos comunes de generación de este valor son: sacar la raíz cuadrada de un número negativo, sacar el logaritmo de un número negativo, 0,0/0,0, 0,0*∞, ∞/∞, etc.
En resumen, si encuentra 1.#INF/inf, verifique si el resultado de la operación se desborda y se divide por cero. Si encuentra 1.#IND/nan, verifique si se ha producido una operación ilegal. .
Juicio de números especiales de punto flotante
Muchas bibliotecas C proporcionan un conjunto de funciones para juzgar si un número de punto flotante es infinito o NaN. La función int _isnan (doble x) se usa para determinar si un número de punto flotante es NaN, mientras que int _finite (doble x) se usa para determinar si un número de punto flotante es infinito.
Es posible que hayas notado que las dos funciones anteriores comienzan con un guión bajo, por lo que puede haber problemas con la portabilidad. Entonces, ¿cómo implementar una versión de juicio universal? Primero, para Nan, puedes usar el siguiente código para lograrlo:
bool IsNumber(double x)
{
// La operación de comparación aquí siempre parece like Se volverá verdadero
// ¡Pero lo interesante es que para el número de punto flotante IEEE 754 NaN, siempre será falso!
return (x == x); p>
}
El siguiente código puede determinar si un número de punto flotante es finito (finito, es decir, ni NaN ni infinito):
bool IsFiniteNumber(double x)
{
return (x lt; = DBL_MAX amp; amp; x gt; = -DBL_MAX
}
Donde , DBL_MAX es lt; constantes predefinidas en float.hgt;.
Al combinar las dos funciones anteriores, también puede juzgar si un número de punto flotante es Inf.