У меня есть приложение, в котором область кода производит значения NAN. Я должен сравнить значения для равенства и на основе этого выполнить остальную часть кода. Как сравнить два значения NAN в C ++ для равенства?
Предполагая 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 и выполнить некоторую проверку битов. Очевидно, что это не самый портативный вариант.
Что касается пре-C ++ 11, для этого тоже есть толчок.
#include <boost/math/special_functions/fpclassify.hpp>
template <class T>
bool isnan(T t); // NaN.
Любой данный NaN не равен ничему, он никогда не будет равен любому другому NaN, поэтому сравнивать их друг с другом — бесполезное упражнение.
Из документов GNU:
NaN неупорядочен: он не равен, больше или меньше всего, включая себя.
x == x
ложь, если значение x равно NaN. источник