2013-03-07 4 views
8

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

ответ

17

Предполагая представление с плавающей точкой 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 и выполнить некоторую проверку бит. Очевидно, что это не самый переносимый вариант.

+0

Я добавил решение для повышения эффективности в качестве другого ответа. –

+0

@BartekBanachewicz Ах! Я просто добавила это мне тоже! –

+0

Спасибо всем. Прошу прощения, если вопрос не имеет никакого смысла. Просто хотелось узнать, возможно ли это. Функция «isnan» сделает что-то для моего дела. – CodeRider

2

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

От GNU Docs:

NaN является неупорядоченным: оно не равно, больше или меньше, чем что-либо, в том числе себя. x == x неверно, если значение x равно NaN. source

+1

@Aki erm, 0.0/0.0 is NaN. Я не вижу здесь «противоположного». –