【问题标题】:Visual Studio always breaking on "Floating-point inexact result"Visual Studio 总是打破“浮点不精确结果”
【发布时间】:2018-08-12 13:41:48
【问题描述】:

所以这在 VS 2015 和 2017 中都发生了。每次我运行我的应用程序时,它都会在msvcrt.dll 中不断中断Floating-point inexact result 异常,如果我单击Continue,异常会一次又一次地出现。我从Exception Settings 取消选中它,但无论我尝试什么,我似乎都无法阻止它停止。

这就是我得到的:

启用或禁用Just My Code 似乎没有效果,而且我在 Visual Studio 2015 中也出现了这个问题。

请问我该如何解决?

【问题讨论】:

  • 别说破了,为什么要扔?这不是默认行为。
  • 浮点异常由算术异常陷阱发出信号。这些异常包括:无效运算、被零除、溢出、下溢、不精确结果、整数溢出。参考:msdn.microsoft.com/en-us/library/…屏蔽浮点异常没有效果。您需要找出代码中导致此异常的确切原因并修复它。
  • 浮点数不是总是不精确吗?这不是可修复的属性,是吗?
  • 我仍然认为 VS 中的某些设置不能掩盖算术异常。但是您可以使用此答案中提到的这些功能来检查它们:stackoverflow.com/a/15655796/9125096

标签: c++ visual-studio debugging exception


【解决方案1】:

This website 状态:

默认情况下,运行时库会屏蔽所有浮点异常。

在我看来,您的代码通过使用属于一组名为 _clearfp(...)_controlfp(...)_controlfp_s(...) 的函数的一个或多个函数来更改此默认值。

解决问题的方法是将中断异常掩码_MCW_EM设置为默认值。有关掩码常量和值的更多信息,请访问this website

您可以使用以下代码将_MCW_EM设置为默认值:

    //Read
    unsigned int fp_control = 0;
    _controlfp_s(&fp_control, 0, 0);
    //Make changes
    unsigned int new_fp_control = fp_control | _EM_INVALID | _EM_DENORMAL | _EM_ZERODIVIDE | _EM_OVERFLOW | _EM_UNDERFLOW | _EM_INEXACT;
    //Update
    _controlfp_s(&fp_control, new_fp_control, _MCW_EM);

这段代码应该可以解决问题。

【讨论】:

    猜你喜欢
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 2021-12-06
    • 1970-01-01
    • 2018-10-25
    • 2011-04-13
    相关资源
    最近更新 更多