有什么方法可以设置 Visual Studio(刚刚从 2008 年升级到 2010 年)在任何浮点数变为 NaN、QNAN、INF 等时中断,就像断言失败一样?
到目前为止,我一直在使用 assert(x == x) 技巧,但我宁愿使用一些隐含的东西,这样我就不必到处添加断言了。
很惊讶我无法通过谷歌找到答案。关于“浮点异常”的一些内容,但我不确定它们是否相同,并且我已经尝试在 Visual Studio 中启用它们,但程序不会中断,直到由于 NaN 而发生灾难性事件之后在执行中。
有什么方法可以设置 Visual Studio(刚刚从 2008 年升级到 2010 年)在任何浮点数变为 NaN、QNAN、INF 等时中断,就像断言失败一样?
到目前为止,我一直在使用 assert(x == x) 技巧,但我宁愿使用一些隐含的东西,这样我就不必到处添加断言了。
很惊讶我无法通过谷歌找到答案。关于“浮点异常”的一些内容,但我不确定它们是否相同,并且我已经尝试在 Visual Studio 中启用它们,但程序不会中断,直到由于 NaN 而发生灾难性事件之后在执行中。
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;
}
尝试启用 fp 异常
至少在 x86 上,当您生成 NaN 等时,会设置 FPU 状态寄存器位之一。您可以设置一种方法,使其在下一次后续FP 操作发生时引发 H/W 异常,但这并不像您希望的那样快。我不记得参考了。
我不确定这是否可能是您想要的方式,但是您可以创建一个宏,将标记行中的代码包装到一个断言中,或者为此设置一个断点。
希望这可以帮助