У меня есть приложение, в котором область кода создает значения NAN. Мне нужно сравнить значения для равенства и на основе этого выполнить остальную часть кода. Как сравнить два значения NAN в C++ для равенства?Как сравнить два значения NAN в C++
ответ
Предполагая представление с плавающей точкой IEEE 754, вы не можете сравнить два значения NaN для равенства. NaN не равно какой-либо ценности, включая себя. Однако вы можете проверить, если они оба NaN с std::isnan
из заголовка <cmath>
:
if (std::isnan(x) && std::isnan(y)) {
// ...
}
Эта функция доступна только в C++ 11, однако. До C++ 11 Boost Math Toolkit предоставляет некоторые floating point classifiers. Кроме того, вы можете проверить, является ли значение NaN, сравнивая его с собой:
if (x != x && y != y) {
// ...
}
Поскольку NaN является единственным значением, которое не равно самому себе. Раньше некоторые компиляторы скручивали это, но я не уверен в статусе на данный момент (похоже, он корректно работает с GCC).
MSVC предоставляет функцию _isnan.
Окончательный вариант - предположить, что вы знаете, что это представление IEEE 754 и выполнить некоторую проверку бит. Очевидно, что это не самый переносимый вариант.
Любое заданное NaN не равно ни к чему, оно никогда не будет равно ни одному другому NaN, поэтому сравнение их друг с другом - бесполезное упражнение.
От GNU Docs:
NaN является неупорядоченным: оно не равно, больше или меньше, чем что-либо, в том числе себя.
x == x
неверно, если значение x равно NaN. source
@Aki erm, 0.0/0.0 is NaN. Я не вижу здесь «противоположного». –
Относительно pre-C++ 11, there's a boost for that, too.
#include <boost/math/special_functions/fpclassify.hpp>
template <class T>
bool isnan(T t); // NaN.
Я добавил решение для повышения эффективности в качестве другого ответа. –
@BartekBanachewicz Ах! Я просто добавила это мне тоже! –
Спасибо всем. Прошу прощения, если вопрос не имеет никакого смысла. Просто хотелось узнать, возможно ли это. Функция «isnan» сделает что-то для моего дела. – CodeRider