Est-il possible d'attribuer un NaN
à un double
o float
en C/C++ ? Comme en JavaScript, vous le faites : a = NaN
. Ainsi, plus tard, vous pourrez vérifier si la variable est un nombre ou non.
Réponses
Trop de publicités?Comme d'autres l'ont souligné, vous recherchez std::numeric_limits<double>::quiet_NaN()
bien que je doive dire que je préfère le cppreference.com documents. Surtout que cette déclaration est un peu vague :
N'a de sens que si std::numeric_limits::has_quiet_NaN == true.
et il était simple de comprendre ce que cela signifie sur ce site, si vous vérifiez leur section sur std::numeric_limits::has_quiet_NaN
il est dit :
Cette constante est significative pour tous les types à virgule flottante et est garantie comme étant vraie si std::numeric_limits::is_iec559 == true.
qui, comme expliqué aquí si true
signifie que votre plateforme supporte IEEE 754
standard. Ce site fil précédent explique que cela devrait être vrai pour la plupart des situations.
Cela peut être fait en utilisant les numeric_limits en C++ :
http://www.cplusplus.com/reference/limits/numeric_limits/
Ce sont les méthodes que vous voulez probablement examiner :
infinity() T Representation of positive infinity, if available.
quiet_NaN() T Representation of quiet (non-signaling) "Not-a-Number", if available.
signaling_NaN() T Representation of signaling "Not-a-Number", if available.
Est-il possible d'assigner un NaN à un double ou un flottant en C ... ?
Oui, depuis C99, (C++11) <math.h>
offre les fonctions suivantes :
#include <math.h>
double nan(const char *tagp);
float nanf(const char *tagp);
long double nanl(const char *tagp);
qui sont comme leurs strtod("NAN(n-char-sequence)",0)
homologues et NAN
pour les affectations.
// Sample C code
uint64_t u64;
double x;
x = nan("0x12345");
memcpy(&u64, &x, sizeof u64); printf("(%" PRIx64 ")\n", u64);
x = -strtod("NAN(6789A)",0);
memcpy(&u64, &x, sizeof u64); printf("(%" PRIx64 ")\n", u64);
x = NAN;
memcpy(&u64, &x, sizeof u64); printf("(%" PRIx64 ")\n", u64);
Exemple de sortie : (dépend de l'implémentation)
(7ff8000000012345)
(fff000000006789a)
(7ff8000000000000)
... vérifier si la variable est un nombre ou non.
Utilisez isnan(), std::isnan()
de <math.h>, <cmath>
.