2013-08-08 16 views
50

私は浮動小数点について読んだことがあり、NaNが操作の結果である可能性があることを理解しています。しかし、私はこれらの概念が正確に何であるか理解できません。違いは何ですか?静かなNaNとシグナリングNaNの違いは何ですか?

C++プログラミング中にどちらを作成できますか?プログラマーとして、プログラムを書くことでsNaNができますか?

答えて

37

オペレーションの結果が静かなNaNになった場合、プログラムが結果をチェックしてNaNを参照するまで、何か珍しいことはありません。つまり、浮動小数点ユニットがソフトウェアで実装されている場合、浮動小数点ユニット(FPU)またはライブラリからの信号なしで計算が継続されます。シグナリングNaNは、通常はFPUから例外の形で信号を生成します。例外がスローされるかどうかは、FPUの状態に依存します。

C++ 11はいくつかの言語を追加しますcontrols over the floating-point environmentstandardized ways to create and test for NaNsを提供します。ただし、コントロールが実装されているかどうかはよく標準化されておらず、浮動小数点例外は標準的なC++例外と同じように捕捉されません。

POSIX/Unixシステムでは、通常、浮動小数点例外はSIGFPEのハンドラを使用して捕捉されます。

+20

これに追加:一般に、シグナリングNaN(sNaN)の目的はデバッグ用です。たとえば、浮動小数点オブジェクトはsNaNに初期化されます。次に、プログラムが使用する前に値の1つに値がない場合、プログラムが算術演算でsNaNを使用すると例外が発生します。プログラムが誤ってsNaNを生成することはありません。通常の操作ではsNaNが生成されません。それらは、算術演算の結果ではなく、シグナリングNaNを持つ目的でのみ作成されます。 –

+8

対照的に、NaNはより一般的なプログラミングのためのものです。数値的結果がない場合(例えば、結果が真でなければならない場合には負の数の平方根をとる)、通常の演算によって生成することができる。その目的は、一般的に算術演算をある程度正常に進めることです。たとえば、数字の膨大な配列があります。そのうちのいくつかは、通常処理できない特殊なケースを表しています。この配列を処理するために複雑な関数を呼び出すことができ、通常の算術演算で配列に作用し、NaNは無視します。終了後は、特別なケースを分けて、より多くの作業を行うことができます。 –

+0

@wrdieterありがとうございます。 – JalalJaberi