2012-04-12 13 views
1

doubleの値がNaNまたは#INFの場合、動作を切り離したいと思います。 NaNを検出するために、私は何#INFについてC++ doubleが#INFであるかどうかテスト

doubleVal != doubleVal 

テスト? doubleVal#INFの場合、このテストは成立しますか?

答えて

4

方法が1.乗算について一度あなたはそれがNaNではないと確信していますか?

http://ideone.com/97FNu

またisinfisnanを使用することができますが、それらは彼らの実装によっては、いくつかのオーバーヘッドが発生することがあります。

第3の選択肢は、C max値マクロ(または同等std::numeric_limits)を使用している。また、

bool is_inf_or_nan(double x) 
{ 
    return !(x <= DBL_MAX && x >= -DBL_MAX); 
}  
+0

私はこの代替ソリューションが好きです – octoback

3

C++ 11を使用していない場合は、<cmath>の代わりに<boost/math/special_functions/fpclassify.hpp>と対応する名前空間の変更が必要です。

#include <cmath> // or <boost/math/special_functions/fpclassify.hpp> 
// ... 

    if(isinf(num)){ 
     // ... 
    } 
+1

が、あなたはおそらくそれがより明確だかの理由だけでは、NaNをチェックするために 'のstd :: isnan'を使用する必要があります。 – James

3

あなたは以下の機能を取得する浮動小数点データ型

#include <boost/math/special_functions/fpclassify.hpp> 

に対処するためのきちんとしたツールを持ってブースト中にheader-only library存在もあります:

template <class T> bool isfinite(T z); 
template <class T> bool isinf(T t); 
template <class T> bool isnan(T t); 
template <class T> bool isnormal(T t); 
関連する問題