web-dev-qa-db-fra.com

Modélisation de l'infini pour la plus grande valeur double

La question concerne la modélisation de l'infini en C++ pour le type de données double. J'en ai besoin dans un fichier d'en-tête, nous ne pouvons donc pas utiliser des fonctions comme numeric_limits

Existe-t-il une constante définie représentant la plus grande valeur?

16
ashim

les nombres à virgule flottante (tels que les doubles) peuvent en réalité contenir des infinis positifs et négatifs. La constante INFINITY devrait être dans votre en-tête math.h.

Je suis allé en plongée standard et j'ai trouvé le texte:

4 La macro INFINITY se développe en une expression constante de type float représentant l'infini positif ou non signé, si disponible; autrement à un constante positive de type float qui déborde au moment de la traduction.

Dans la section 7.12 Mathematics <math.h>


Ensuite, bien sûr, vous avez la fonction d'assistance isinf pour tester l'infini (qui est également dans math.h).

7.12.3.3 La macro isinf

int isinf (x réel flottant); 

Description: la macro isinf détermine si la valeur de son argument est un infini (positif Ou négatif). Tout d'abord, un argument représenté dans un format plus large que son type sémantique est converti en son type sémantique. Ensuite la détermination est basée sur le type de l'argument. 

Retours: Le La macro isinf renvoie une valeur différente de zéro si et seulement si son argument a un valeur infinie.

24
Lalaland

Les fonctions numeric_limits sont toutes constexpr et fonctionnent donc bien comme constantes de compilation (en supposant que vous utilisiez la version actuelle de C++). Donc, std::numeric_limits<double>::infinity() devrait fonctionner dans n'importe quel contexte.

Même si vous utilisez une version plus ancienne, cela fonctionnera quand vous n’avez pas besoin d’une constante de temps de compilation. Votre question ne dit pas clairement si votre utilisation nécessite réellement une constante de temps de compilation ou non; le fait d'être dans un en-tête ne l'exige pas nécessairement.

Si vous utilisez une version plus ancienne et que vous avez vraiment besoin d'une constante de temps de compilation, la macro INFINITY in cmath devrait fonctionner pour vous. C'est en fait la valeur float pour l'infini, mais elle peut être convertie en un double.

20
bames53

Vous ne savez pas pourquoi vous ne pouvez pas utiliser std :: numeric_limits dans un fichier d'en-tête. Mais il y a aussi ce report de ANSI C:

#include <cfloat>

DBL_MAX
9
Gerald

DBL_MAX peut être utilisé. Ceci se trouve dans float.h comme suit

    #define DBL_MAX         1.7976931348623158e+308 /* max value */
1
Ajit Vaze

Je pensais que la réponse était " 42.0 ";)

Cet article pourrait être d'intérêt:

http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm

Ou ca:

http://www.cplusplus.com/reference/clibrary/cfloat/

MAXimum Nombre maximal fini représentable:

FLT_MAX  1E+37
DBL_MAX  1E+37
LDBL_MAX 1E+37  
1
paulsm4

Peut-être que dans votre environnement C++ vous avez float.h, consultez http://www.gamedev.net/topic/392211-max-value-for-double-/ (DBL_MAX)

1
Joop Eggen

De Wikipedia :

0x 7ff0 0000 0000 0000   = Infinity
0x fff0 0000 0000 0000   = −Infinity
1
fge

Est-ce que ça ne marcherait pas?

const double infinity =  1.0/0.0;
0
Pubby
#include <cmath>
...
double d = INFINITY;

Vous pouvez trouver INFINITY défini dans <cmath> ( math.h ):

Une expression constante de type float représentant l'infini positif ou non signé, si disponible; sinon une constante positive de type float qui déborde au moment de la traduction.

0
AusCBloke