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?
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.
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
.
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
DBL_MAX peut être utilisé. Ceci se trouve dans float.h comme suit
#define DBL_MAX 1.7976931348623158e+308 /* max value */
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
Peut-être que dans votre environnement C++ vous avez float.h
, consultez http://www.gamedev.net/topic/392211-max-value-for-double-/ (DBL_MAX)
De Wikipedia :
0x 7ff0 0000 0000 0000 = Infinity
0x fff0 0000 0000 0000 = −Infinity
Est-ce que ça ne marcherait pas?
const double infinity = 1.0/0.0;
#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 typefloat
qui déborde au moment de la traduction.