27

浮動小数点数が NaN、 QNAN、INF などになるたびに、アサーションが失敗したかのように、Visual Studio (2008 から 2010 にアップグレードしたばかり) を中断するように設定する方法はありますか?

今まで私は assert(x == x) トリックを使用していましたが、どこにでもアサーションを追加する必要がないように、暗黙的なものを使用したいと考えています。

グーグル経由でこれに対する答えが見つからないことに非常に驚いています。「浮動小数点例外」に関するいくつかのことですが、それらが同じものであるかどうかはわかりません.Visual Studioでそれらを有効にしようとしましたが、後でNaNのために何か壊滅的なことが起こるまでプログラムは壊れません.実行中。

4

4 に答える 4

31

1) プロジェクト オプションに移動し、 /fp:strictを有効にします(C/C++ -> コード生成 -> フローティング パイント モデル)。

2) _controlfpを使用して、浮動小数点制御ワードを設定します (以下のコードを参照)。

#include <float.h>
unsigned int fp_control_state = _controlfp(_EM_INEXACT, _MCW_EM);

#include <math.h>

int main () {

    sqrtf(-1.0);    // floating point exception

    double x = 0.0;
    double y = 1.0/x;   // floating point exception

    return 0;
}
于 2010-12-15T21:38:40.273 に答える
4

fp 例外を有効にしてみてください

于 2010-12-15T20:45:51.973 に答える
1

少なくとも x86 では、NaN などを生成すると、FPU ステータス レジスタ ビットの 1 つが設定されます。次の後続のFP 操作が発生したときに H/W 例外をスローするように設定できる方法がありますが、それは期待したほど早くはありません。参考書は思い出せないけど。

于 2010-12-15T20:36:41.977 に答える
0

これがあなたが望む方法で可能かどうかはわかりませんが、マークされた行のコードをアサートにラップするマクロ、またはこれにブレークポイントを設定するマクロを作成できます。

お役に立てれば

于 2010-12-15T20:35:31.457 に答える