Comment comparer deux valeurs NAN en C ++

J’ai une application dans laquelle une zone de code produit des valeurs NAN. Je dois comparer les valeurs pour l’égalité et sur cette base exécuter le rest du code. Comment comparer deux valeurs NAN en C ++ pour l’égalité?

En supposant une représentation à virgule flottante IEEE 754, vous ne pouvez pas comparer deux valeurs NaN pour l’égalité. NaN n’est égal à aucune valeur, y compris elle-même. Vous pouvez toutefois vérifier s’ils sont tous les deux NaN avec std::isnan partir de l’en-tête :

 if (std::isnan(x) && std::isnan(y)) { // ... } 

Ceci est uniquement disponible en C ++ 11, cependant. Avant C ++ 11, Boost Math Toolkit fournissait des classificateurs en virgule flottante . Alternativement, vous pouvez vérifier si une valeur est NaN en la comparant avec elle-même:

 if (x != x && y != y) { // ... } 

Puisque NaN est la seule valeur qui ne soit pas égale à elle-même. Dans le passé, certains compilateurs ont tout gâché, mais je ne suis pas sûr du statut pour le moment (cela semble fonctionner correctement avec GCC).

MSVC fournit une fonction _isnan .

La dernière solution consiste à supposer que vous savez que la représentation est IEEE 754 et à effectuer quelques vérifications. Évidemment ce n’est pas l’option la plus portable.

En ce qui concerne la version antérieure à C ++ 11, cela a également un impact positif .

 #include  template  bool isnan(T t); // NaN. 

Un NaN donné n’est égal à rien, il ne sera jamais égal à un autre NaN. Il est donc inutile de les comparer les uns aux autres.

De la documentation GNU:

NaN n’est pas ordonné: il n’est pas égal, supérieur ou inférieur à tout, y compris lui-même. x == x est faux si la valeur de x est NaN. la source