Существует три «официальных» способа: макрос posix isnan
, c ++ 0x isnan
или визуальная функция c ++ _isnan
.
К сожалению, нецелесообразно обнаруживать, какая из те, которые будут использоваться.
И, к сожалению, нет надежного способа определить, есть ли у вас представление IEEE 754 с NaN. Стандартная библиотека предлагает такой официальный способ (numeric_limits<double>::is_iec559
). Но на практике компиляторы, такие как g ++, закручивают это.
В теории можно было бы просто использовать x != x
, но компиляторы, такие как g ++ и визуальный c ++-винт, вверху.
Итак, в end, протестировать конкретные битпаттеры NaN, предполагая (и, надеюсь, в какой-то момент применение) конкретное представление, такое как IEEE 754.
EDIT: в качестве примера «компиляторы, такие как g ++ и hellip , закрутите это вверх ", рассмотрите
#include <limits>
#include <assert.h>
void foo( double a, double b )
{
assert( a != b );
}
int main()
{
typedef std::numeric_limits<double> Info;
double const nan1 = Info::quiet_NaN();
double const nan2 = Info::quiet_NaN();
foo( nan1, nan2 );
}
Компиляция с g ++ (TDM-2 mingw32) 4.4.1:
C:\test> type "C:\Program Files\@commands\gnuc.bat" @rem -finput-charset=windows-1252 @g++ -O -pedantic -std=c++98 -Wall -Wwrite-strings %* -Wno-long-long C:\test> gnuc x.cpp C:\test> a && echo works... || echo !failed works... C:\test> gnuc x.cpp --fast-math C:\test> a && echo works... || echo !failed Assertion failed: a != b, file x.cpp, line 6 This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information. !failed C:\test> _