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

結果の見せ方がよくないな…