¿Cuál es la solución recomendada si numeric_limits < double > :: has_infinity es falso?
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?
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.