NaNは == では判定できないよ
この間の続き。
Inf/NaNは計算の失敗時に発生する値。
この値がでるとそのあとの処理はうまくいかない。
そのときに判定を間違えると面倒だよ。。
if( _finite(value) != 0 ) // Inf/NaNである
Inf/NaNを判定するには、_finite を使うこと。
if( DEF_NaN == value ) // NaNである
なんてことはできないよ。 >俺!
あとは、参考。
#include <iostream> #include <limits> const double DEF_Inf = std::numeric_limits<double>::infinity(); const double DEF_NaN = std::numeric_limits<double>::quiet_NaN(); void printf_okng(bool f) { if( f ) std::cout << "OK" << std::endl; else std::cout << "NG" << std::endl; } int _tmain(int argc, _TCHAR* argv[]) { double val; val = DEF_Inf; std::cout << "val = DEF_Inf;" << std::endl; std::cout << "val == DEF_Inf" << std::endl; printf_okng( val == DEF_Inf ); std::cout << "_isnan( val ) != 0" << std::endl; printf_okng( _isnan( val ) != 0 ); std::cout << "_finite( val ) == 0" << std::endl; printf_okng( _finite( val ) == 0 ); std::cout << std::endl; val = DEF_NaN; std::cout << "val = DEF_NaN;" << std::endl; std::cout << "val == DEF_NaN" << std::endl; printf_okng( val == DEF_NaN ); std::cout << "_isnan( val ) != 0" << std::endl; printf_okng( _isnan( val ) != 0 ); std::cout << "_finite( val ) == 0" << std::endl; printf_okng( _finite( val ) == 0 ); std::cout << std::endl; return 0; }
結果
val = DEF_Inf; val == DEF_Inf OK _isnan( val ) != 0 NG _finite( val ) == 0 OK val = DEF_NaN; val == DEF_NaN NG _isnan( val ) != 0 OK _finite( val ) == 0 OK
結果の見せ方がよくないな…