2011-12-27 16 views
16

La pregunta es sobre el modelado de infinito en C++ para el tipo de datos double. Lo necesito en un archivo de cabecera, por lo que no podemos usar funciones como numeric_limits.Modelado de infinito para el valor doble más grande

¿Hay una constante definida que represente el valor más grande?

Respuesta

24

números de coma flotante (como los dobles) pueden contener infinito positivo y negativo. La constante INFINITY debería estar en su encabezado math.h.

fue a bucear estándar y conocer el texto:

4 El INFINITY macro se expande a una expresión constante de tipo float representa el infinito positivo o sin firma, si está disponible; else a una constante positiva de tipo float que se desborda en el tiempo de traducción.

En la sección 7.12 Mathematics <math.h>


Luego, por supuesto que tienen la función de ayuda isinf para probar el infinito (que también está en math.h).

7.12.3.3 El isinf macro

int isinf (x Real-flotante);

Descripción: La macro isinf determina si su valor de argumento es infinito (positivo o negativo). Primero, un argumento representado en un formato más ancho 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 de .

+1

@JamWaffles Los estándares C son realmente sorprendentemente legibles. Son los estándares de C++ que parecen escritos por abogados de lenguaje excesivamente entusiastas. – Lalaland

+6

Dado que la pregunta está pidiendo técnicamente para qué "C++" la cabecera #include se debe utilizar en lugar de # include . – lefticus

0

¿No funcionaría?

const double infinity = 1.0/0.0; 
9

No estoy seguro de por qué no puede usar std :: numeric_limits en un archivo de encabezado.Pero también existe esta prorrogados de ANSI C:

#include <cfloat> 

DBL_MAX 
0
#include <cmath> 
... 
double d = INFINITY; 

puede encontrar INFINITY definido en <cmath> (math.h):

Expresión constante de tipo float que representa infinito positivo o sin signo, si está disponible; bien una constante positiva del tipo float que se desborda en tiempo de traducción.

1

De Wikipedia:

0x 7ff0 0000 0000 0000 = Infinity 
0x fff0 0000 0000 0000 = −Infinity 
+0

Por supuesto, el OP podría estar en una plataforma que no usa números de punto flotante IEEE. – Omnifarious

+0

@Omnifarious ¿hay alguno? – fge

+0

No conozco ninguna plataforma actual. Pero mi viejo sistema Atari de 8 bits no (y sí, tenía punto flotante). Pero es mala forma independientemente. No se dice que el punto flotante IEEE será la forma en que se hacen las cosas en diez años. Esto invita a la creación de otro 'error del milenio'. – Omnifarious

19

numeric_limits funciones son todos constexpr por lo que funcionan muy bien como constantes de tiempo de compilación (asumiendo que usted está utilizando la versión actual de C++). Entonces, std::numeric_limits<double>::infinity() debería funcionar en cualquier contexto.

Incluso si usted está utilizando una versión anterior, esto todavía funcionará en cualquier lugar que no se requiere una constante de tiempo de compilación. No está claro a partir de su pregunta si su uso realmente necesita una constante de tiempo de compilación o no; solo 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 infinito, pero se puede convertir a double.

1

DBL_MAX se puede utilizar. Esto se encuentra en float.h como sigue

#define DBL_MAX   1.7976931348623158e+308 /* max value */ 
Cuestiones relacionadas