【问题标题】:Visual Studio C++ 2008 / 2010 - break on float NaNVisual Studio C++ 2008 / 2010 - 浮点 NaN 中断
【发布时间】:2011-05-26 04:06:16
【问题描述】:

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

到目前为止,我一直在使用 assert(x == x) 技巧,但我更喜欢隐含的东西,这样我就不必到处添加断言了。

很惊讶我无法通过谷歌找到答案。关于“浮点异常”的一些内容,但我不确定它们是否相同,并且我尝试在 Visual Studio 中启用它们,但程序不会中断,直到后来由于 NaN 发生灾难性事件正在执行中。

【问题讨论】:

    标签: c++ visual-studio visual-studio-2010 floating-point floating-point-exceptions


    【解决方案1】:

    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;
    }
    

    【讨论】:

    • 其实你是对的。您正在取消屏蔽除 _EM_INEXACT 之外的所有异常,因此将触发 _EM_INVALID。
    • fp 控制字是每个线程的状态。为了让这个东西在多线程环境中工作每个线程调用一次_controlfp。对我来说另一个问题是我需要设置 C/C++ -> 代码生成 -> 将 Enable C++ Exceptions 修改为“Yes With SEH Exceptions” 以获得任何中断。
    【解决方案2】:

    【讨论】:

    • 好的,添加了 _clearfp 和 _controlfp 命令,以及 Visual Studio 菜单选项。不过,仍然没有出现异常,但我认为这是一个单独的问题,因为值是 QNAN,它似乎不会引发异常。我将提出一个与此相关的新问题。
    【解决方案3】:

    至少在 x86 上,当您生成 NaN 等时,会设置 FPU 状态寄存器位之一。您可以设置一种方法,以便它在 下一个后续 FP 操作发生时引发 H/W 异常,但这并不像您希望的那样快。我不记得参考了。

    【讨论】:

    • 试图找到一种方法来做到这一点。我能找到的只是 Visual Studio 中“代码生成”下的浮点异常选项。但是,启用例外没有任何效果。
    • 查看 watson1180 的回答和这个:stackoverflow.com/questions/2769814/…
    【解决方案4】:

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

    希望对你有帮助

    【讨论】:

    • 我不确定你的意思。听起来您的意思是添加断言语句但将其包装在宏中?这有什么帮助?
    猜你喜欢
    • 2011-01-16
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多