142 votes

C/C++ NaN constant (littéral) ?

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.

189voto

Mike Seymour Points 130519

En C, NAN est déclaré dans <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 à une autre valeur NaN. Utilisez plutôt isnan() de <math.h> en C, ou std::isnan() de <cmath> en C++.

29voto

Shafik Yaghmour Points 42198

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.

9voto

languitar Points 537

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.

4voto

chux Points 13185

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> .

-11voto

Oui, par le concept de pointeur vous pouvez le faire comme ceci pour une variable int :

int *a;
int b=0;
a=NULL; // or a=&b; for giving the value of b to a
if(a==NULL) 
  printf("NULL");
else
  printf(*a);

C'est très simple et direct. Cela a fonctionné pour moi dans Arduino IDE.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X