Est-ce possible d'attribuer un NaNà un doubleou floaten C / C ++? Comme en JavaScript vous: a = NaN. Ainsi, plus tard, vous pourrez vérifier si la variable est un nombre ou non.
En C ++, std::numeric_limits<double>::quiet_NaN()est déclaré dans <limits>.
Mais pour vérifier si une valeur est NaN, vous ne pouvez pas la comparer avec une autre valeur NaN. Utilisez plutôt à isnan()partir <math.h>de C ou à std::isnan()partir <cmath>de C ++.
Ou vous pouvez comparer le nombre à lui-même - x == xrenvoie falsessi xest NaN.
Archie
7
@Archie: Je ne pense pas que ce soit garanti dans les deux langues.
Mike Seymour
3
@MikeSeymour Pas par le standard du langage mais pour autant que je sache, cela devrait fonctionner si le compilateur prétend être conforme à IEEE.
Pixelchemist
37
@Pixelchemist: En effet, c'est une option si vous avez besoin d'obscurcissement mais pas de portabilité. Personnellement, je préfère la portabilité sans obfuscation, donc je ne le suggérerai pas moi-même.
Mike Seymour
9
note mineure: NAN est un flotteur, pas un double. lien
orion elenzil
23
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 parce que cette affirmation est un peu vague:
Uniquement significatif 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_NaNelle dit:
Cette constante est significative pour tous les types à virgule flottante et est garantie vraie si std :: numeric_limits :: is_iec559 == true.
qui , comme expliqué ici si des truemoyens de votre plate - forme prend en charge IEEE 754standard. Ce fil précédent explique que cela devrait être vrai dans la plupart des situations.
Voici les méthodes que vous voudrez 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.
Réponses:
En C,
NAN
est déclaré en<math.h>
.En C ++,
std::numeric_limits<double>::quiet_NaN()
est déclaré dans<limits>
.Mais pour vérifier si une valeur est NaN, vous ne pouvez pas la comparer avec une autre valeur NaN. Utilisez plutôt à
isnan()
partir<math.h>
de C ou àstd::isnan()
partir<cmath>
de C ++.la source
x == x
renvoiefalse
ssix
est NaN.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 parce que cette affirmation est un peu vague: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
elle dit:qui , comme expliqué ici si des
true
moyens de votre plate - forme prend en chargeIEEE 754
standard. Ce fil précédent explique que cela devrait être vrai dans la plupart des situations.la source
Cela peut être fait en utilisant les numeric_limits en C ++:
http://www.cplusplus.com/reference/limits/numeric_limits/
Voici les méthodes que vous voudrez probablement examiner:
la source
Oui, depuis C99, (C ++ 11)
<math.h>
offre les fonctions ci-dessous:qui sont comme leurs
strtod("NAN(n-char-sequence)",0)
homologues etNAN
pour les affectations.Exemple de sortie: (en fonction de l'implémentation)
la source