7

SO ( Using NaN in C++ )に関する別の質問を見た後、私はstd::numeric_limits<double>::signaling_NaN().

signalling_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_NaNtrue と評価されるため、私のシステムに実装されています。

何か案は?

ms Visual Studio .net 2003 の C++ コンパイラを使用しています。家に帰ったら、別のものでテストしたいと思います。

ありがとう!

4

4 に答える 4

5

警告: サード パーティの DLL を使用すると、これらの例外が暗黙のうちに有効になる場合があります。これは、既定で有効になる言語で記述された DLL をロードする場合に特に当てはまります。

埋め込みブラウザ コントロールから HP プリンタへの印刷と、Delphi で記述された InnoSetup からの DLL (初期値を NaN に設定する) の登録の 2 つの例で、これが発生しました。

于 2008-10-26T02:17:18.503 に答える
5

この関数を使用し_control87()て、浮動小数点例外を有効にすることができます。次の MSDN ドキュメントから_control87():

ノート:

ランタイム ライブラリは、デフォルトですべての浮動小数点例外をマスクします。

浮動小数点例外が有効になっている場合は、signal()またはSEH (構造化例外処理)を使用してそれらをキャッチできます。

于 2008-10-25T06:45:51.280 に答える
1

鍵は にありますnumeric_limits<T>::has_signaling_NaN。これはあなたにとってどのような価値がありますか? false(MSDN は、常にMSVC 用であることを示唆しているようです?)

于 2008-10-25T17:19:05.283 に答える
1

TFMから:

cout << "The signaling NaN for type float is:  "
    << numeric_limits<float>::signaling_NaN( )
    << endl;

->

float 型のシグナリング NaN は 1.#QNAN です。

ここで、「Q」は「静か」を表します。なぜそれが返されるのかはわかりませんが、それが例外をスローしない理由です。

好奇心から、これはうまくいきますか?

const double &real_snan( void )
{
    static const long long snan = 0x7ff0000080000001LL;
    return *(double*)&snan;
}
于 2008-10-25T00:18:10.953 に答える