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

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

Dans C, NAN est déclaré dans .

Dans C ++, std::numeric_limits::quiet_NaN() est déclaré dans .

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 de dans C, ou std::isnan() partir de dans C ++.

Comme d’autres l’ont fait remarquer, vous recherchez std::numeric_limits::quiet_NaN() même si je dois dire que je préfère les documents cppreference.com . Surtout parce que cette déclaration est un peu vague:

Seulement 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_NaN il dit:

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

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

Cela peut être fait en utilisant le 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. 

Généralement, ce n’est pas une bonne idée d’avoir des numéros invalides dans votre programme. Il peut être très difficile de s’en débarrasser plus tard et ils peuvent causer un plantage de votre programme.

Voici une bonne liste de façons d’attraper de tels nombres sans leur assigner: https://studiofreya.com/cpp/1-inf-1-ind-and-qnan-floating-point-numbers-and-errors/#Capturing -les erreurs

En bref, il y en a trois:

  • Comparaison
  • en utilisant le standard c ++ 11
  • en utilisant les mots de contrôle _controlfp et _control87