Как сравнить два значения NAN в переполнении стека

У меня есть приложение, в котором область кода производит значения NAN. Я должен сравнить значения для равенства и на основе этого выполнить остальную часть кода. Как сравнить два значения NAN в C ++ для равенства?

8

Решение

Предполагая IEEE 754 представление с плавающей запятой, вы не можете сравнить два значения NaN на равенство. NaN не равно ни одному значению, включая себя. Однако вы можете проверить, являются ли они оба NaN с std::isnan от <cmath> заголовок:

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

Однако это доступно только в C ++ 11. До C ++ 11 Boost Math Toolkit предоставляет некоторые классификаторы с плавающей точкой. Кроме того, вы можете проверить, является ли значение NaN, сравнивая его с самим собой:

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

Поскольку NaN является единственной величиной, которая не равна самой себе. В прошлом некоторые компиляторы облажались, но в данный момент я не уверен в статусе (похоже, он корректно работает с GCC).

MSVC обеспечивает _isnan функция.

Последняя альтернатива — предположить, что вы знаете представление IEEE 754 и выполнить некоторую проверку битов. Очевидно, что это не самый портативный вариант.

17

Другие решения

Что касается пре-C ++ 11, для этого тоже есть толчок.

#include <boost/math/special_functions/fpclassify.hpp>

template <class T>
bool isnan(T t); // NaN.
3

Любой данный NaN не равен ничему, он никогда не будет равен любому другому NaN, поэтому сравнивать их друг с другом — бесполезное упражнение.

Из документов GNU:

NaN неупорядочен: он не равен, больше или меньше всего, включая себя. x == x ложь, если значение x равно NaN. источник

2
По вопросам рекламы [email protected]