std :: signaling_nanの使用方法は?
-
04-07-2019 - |
質問
SOに関する別の質問を見た後( C ++でのNaNの使用) std::numeric_limits<double>::signaling_NaN()
。
signaling_NaNを取得して例外をスローできませんでした。私はおそらくそれをシグナリングすることで本当にシグナルを意味すると思ったので、私はSIGFPEをキャッチしようとしましたが、いいえ...
ここに私のコードがあります:
double my_nan = numeric_limits<double>::signaling_NaN();
my_nan++;
my_nan += 5;
my_nan = my_nan / 10;
my_nan = 15 / my_nan;
cout << my_nan << endl;
numeric_limits<double>::has_signaling_NaN
はtrueと評価されるため、システムに実装されます。
アイデアはありますか
私はms visual studio .net 2003のC ++コンパイラを使用しています。家に帰ったら別の場所でテストしたい。
ありがとう!
解決
_control87()
関数を使用して、フローティングを有効にすることができます。ポイント例外。 signal()
のMSDNドキュメントから:
注:
ランタイムライブラリは、デフォルトですべての浮動小数点例外をマスクします。
浮動小数点の例外が有効になっている場合、 <=> または SEH(構造化例外処理)をキャッチするそれら。
他のヒント
警告の言葉: サードパーティのDLLを使用すると、これらの例外が暗黙的に有効になる場合があります。これは、デフォルトで有効にする言語で記述されたDLLをロードする場合に特に当てはまります。
埋め込みブラウザコントロールからHPプリンターへの印刷、およびDelphiで作成されたInnoSetupからのDLL(一部の初期値をNaNに設定)の登録という2つの場合に発生しました。
TFM から:
cout << "The signaling NaN for type float is: "
<< numeric_limits<float>::signaling_NaN( )
<< endl;
-<!> gt;
float型のシグナルNaNは1.#QNANです
「Q」は「Quiet」を表します。 Dunnoがなぜそれを返すのか、それが例外をスローしない理由です。
好奇心から、これはより良く機能しますか?
const double &real_snan( void )
{
static const long long snan = 0x7ff0000080000001LL;
return *(double*)&snan;
}