27

有什么方法可以设置 Visual Studio(刚刚从 2008 年升级到 2010 年)在任何浮点数变为 NaN、QNAN、INF 等时中断,就像断言失败一样?

到目前为止,我一直在使用 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 状态寄存器位之一。您可以设置一种方法,使其在下一次后续FP 操作发生时引发 H/W 异常,但这并不像您希望的那样快。我不记得参考了。

于 2010-12-15T20:36:41.977 回答
0

我不确定这是否可能是您想要的方式,但是您可以创建一个宏,将标记行中的代码包装到一个断言中,或者为此设置一个断点。

希望这可以帮助

于 2010-12-15T20:35:31.457 回答