c++ - define - Modelando el infinito para el mayor valor doble
inf c++ error (9)
¿No funcionaría esto?
const double infinity = 1.0/0.0;
La pregunta es sobre el modelado del infinito en C ++ para el tipo de datos double
. Lo necesito en un archivo de encabezado, por lo que no podemos usar funciones como numeric_limits
.
¿Hay una constante definida que representa el valor más grande?
DBL_MAX puede ser utilizado. Esto se encuentra en float.h como sigue
#define DBL_MAX 1.7976931348623158e+308 /* max value */
De Wikipedia :
0x 7ff0 0000 0000 0000 = Infinity
0x fff0 0000 0000 0000 = −Infinity
No estoy seguro de por qué no puedes usar std :: numeric_limits en un archivo de encabezado. Pero también hay esto transferido de ANSI C:
#include <cfloat>
DBL_MAX
Pensé que la respuesta era " 42.0 ";)
Este artículo podría ser de interés:
http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
O esto:
http://www.cplusplus.com/reference/clibrary/cfloat/
Número máximo de punto flotante representable finito máximo:
FLT_MAX 1E+37
DBL_MAX 1E+37
LDBL_MAX 1E+37
Tal vez en su entorno C ++ tenga float.h
, consulte http://www.gamedev.net/topic/392211-max-value-for-double-/ (DBL_MAX)
los números de punto flotante (como los dobles) pueden contener infinito positivo y negativo. La constante INFINITY debe estar en su encabezado math.h.
Se fue al buceo estándar y encontró el texto:
4 La macro INFINITY se expande a una expresión constante de tipo float que representa infinito positivo o sin signo, si está disponible; de lo contrario, a una constante positiva de tipo float que se desborda en el momento de la traducción.
En la Sección 7.12 Mathematics <math.h>
Luego, por supuesto, tiene la función de ayuda isinf
para probar el infinito (que también está en math.h).
7.12.3.3 La macro isinf
int isinf (x flotante real);
Descripción: la macro isinf determina si el valor de su argumento es infinito (positivo o negativo). Primero, un argumento representado en un formato más amplio que su tipo semántico se convierte a su tipo semántico. Entonces la determinación se basa en el tipo de argumento.
Devuelve: La macro isinf devuelve un valor distinto de cero si y solo si su argumento tiene un valor infinito.
numeric_limits
funciones numeric_limits
son todas constexpr, por lo que funcionan bien como constantes de tiempo de compilación (suponiendo que esté utilizando la versión actual de C ++). Entonces std::numeric_limits<double>::infinity()
debería funcionar en cualquier contexto.
Incluso si está utilizando una versión anterior, esto funcionará en cualquier lugar que no requiera una constante de tiempo de compilación. De su pregunta no queda claro si su uso realmente necesita una constante de tiempo de compilación o no; simplemente estar en un encabezado no necesariamente lo requiere.
Si está utilizando una versión anterior y realmente necesita una constante de tiempo de compilación, la macro INFINITY
en cmath debería funcionar para usted. En realidad, es el valor float
para el infinito, pero se puede convertir en un double
.
#include <cmath>
...
double d = INFINITY;
Puede encontrar INFINITY
definido en <cmath>
( math.h
):
Una expresión constante de tipo
float
representa infinito positivo o sin signo, si está disponible; de lo contrario, una constante positiva de tipofloat
que se desborda en el momento de la traducción.