Pregunta

Necesito verificar un valor doble para infinito en una aplicación C ++ en Linux. En la mayoría de las plataformas esto funciona comparando con std :: numeric_limits < double > :: infinity () . Sin embargo, en algunas plataformas antiguas (RedHat 9, por ejemplo, con gcc 3.2.2) esto no está disponible, y std :: numeric_limits < double > :: has_infinity es falso allí.

¿Qué solución recomendaría para esas plataformas?

¿Fue útil?

Solución 3

Ok, ahora he recurrido al uso de las macros INFINITY y NAN en esa máquina en particular, parece funcionar bien. Vienen de math.h .

Otros consejos

Si está utilizando la aritmética IEEE 754, como seguramente lo hace, los infinitos son valores bien definidos y tienen resultados definidos para todas las operaciones aritméticas. En particular,

infinity - infinity = NaN
Los valores

infinito positivo y negativo y NaN son los únicos valores para los que esto es cierto. Los NaN son especiales "no un número" valores utilizados para indicar errores de dominio de funciones, p. ej. sqrt (-1) . También:

NaN != NaN

NaN s son los únicos valores para los que esto es cierto.

Por lo tanto:

bool is_infinite(double x) {
    double y = x - x;
    return x == x && y != y;
}

devolverá verdadero si y solo si x es infinito positivo o negativo. Agregue una prueba para x > 0 si solo desea verificar el infinito positivo.

Para la mayoría de los casos, std :: numeric_limits :: max () puede ser un reemplazo válido para std :: numeric_limits :: infinity ().

Sin embargo, deberías tener más cuidado al usarlo. Con desbordamientos, creo que tendría que detectar manualmente el desbordamiento y establecer el resultado al máximo explícitamente si se detecta un desbordamiento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top