2012-02-21 4 views
5

を使用してフーリエ変換した結果のstd::complexに、NaNが含まれているかどうかを確認しようとしています。複素数がNaNであるかどうかをチェック

私はBorland C++を使用していますので、std::isnanにアクセスすることはできません。私は数がNaNであれば自分自身にそれを比較することによって、チェックしようとしています:

(n.imag() != n.imag()) 

しかし、できるだけ早く私はn.imag()またはstd::imag(n)呼んとして、私は「浮動小数点無効操作」を取得します。

std::complexが有効であるかどうかを確認する方法はありますか。 NaNが含まれている場合は、

+5

'std :: isnan'をサポートしていない場合は、コンパイラを変更してください。 – Nawaz

+0

Nawaz:それに取り組んでいます。しかし、それは大きなコードベースであり、私はその間に製品を維持しなければならない。 – dagur

答えて

0

ボーランドには独自の数学ライブラリがあることがわかりました。したがって、浮動小数点エラーを避けたい場合は、Borland MathのIsNanを使用してください。

http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/[email protected]

+0

を使用します。複素数でNaNを調べるには、Borlandでこのハックを実行する必要がありました。 ::複合体 n; double a(n._Val [0]); double b(n.Val [1]); IsNan(a)|| IsNan(b)、IsNanはMath.hppで定義されています – dagur

4

これは++グラム上で動作します:

#include<iostream> 
#include<cmath> 
#include<complex> 

int main(){ 

    double x=sqrt(-1.); 
    std::complex<double> c(sqrt(-1.), 2.); 

    std::cout<<x<<"\n"; 
    std::cout<<c<<"\n"; 

    std::cout<< ((c!=c) ? "yup" : "nope")<<"\n"; 
} 
+0

編集:これは動作します。私はこれを試してみました。出力は+ NAN(+ NAN、2)です。 – dagur

+0

@dagur:それはうまくいきました。何か不足していますか? –

+0

はい、私はそれを実現したときに私の応答を編集するのが遅かったのです:)。 – dagur

0

math.hfpclassify()はありますか? NaNの場合はFP_NANを返します。または、より良いが、isnan()を使用する。そのような関数/マクロがない場合は、浮動小数点数または2倍の2進表現を見て、NaNを手動で調べることができます。詳細は、IEEE-754の単精度および倍精度形式を参照してください。

+0

stdにfpclassify()が存在しないようです。C++では – dagur

1

int _isnan(double d); 

float.hヘッダから渡された値がNaNである場合nonzero値(TRUE)を返します。それ以外の場合は0FALSE)を返します。

int _fpclass(double __d); 

引数の浮動小数点クラスを示す整数値を返します。可能な値はFLOAT.H(NaN、INFなど)で定義されています。

関連する問題