web-dev-qa-db-fra.com

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

Est-ce possible d'assigner un NaN à un double ou float en C/C++? Comme en JavaScript, vous faites: a = NaN. Donc, plus tard, vous pouvez vérifier si la variable est un nombre ou non.

100
exebook

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. À la place, utilisez isnan() de <math.h> En C ou std::isnan() de <cmath> En C++.

139
Mike Seymour

Comme d'autres l'ont fait remarquer, vous recherchez std::numeric_limits<double>::quiet_NaN() bien que je dois dire que je préfère les documents cppreference.com . Surtout parce que cette déclaration est un peu vague:

N'existe que si std :: numeric_limits :: has_quiet_NaN == true.

et il était simple de comprendre ce que cela signifie sur ce site, si vous consultez leur section sur std::numeric_limits::has_quiet_NaN il est écrit:

Cette constante est significative pour tous les types à virgule flottante et sa valeur est vraie si std :: numeric_limits :: is_iec559 == true.

comme expliqué ici si true signifie que votre plate-forme prend en charge IEEE 754 la norme. Ce fil précédent explique que cela devrait être vrai dans la plupart des situations.

22
Shafik Yaghmour

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 regarder:

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