首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VS2015与VS2013的不同优化导致浮点异常

VS2015与VS2013的不同优化导致浮点异常
EN

Stack Overflow用户
提问于 2016-10-11 09:29:55
回答 1查看 547关注 0票数 4

在从VS2013到VS2015的过渡过程中,我有一个小的问题。在VS2015中,进一步提到的代码示例导致浮点无效操作。

代码语言:javascript
复制
int main()
{
    unsigned int enableBits = _EM_OVERFLOW | _EM_ZERODIVIDE | _EM_INVALID;

    _clearfp();
    _controlfp_s(0, ~enableBits, enableBits);

    int count = 100;
    float array[100];

    for (int i = 0; i < count; ++i)
    {
        array[i] = (float)pow((float)(count - 1 - i) / count, 4); //this causes exception in VS2015
    }

    return 0;
}

这种情况只发生在发布模式中,因此可能是由不同的优化引起的。这段代码有什么问题吗?还是这是VS 2015中的一个bug?

很难在整个代码库中找到这样的问题,所以我正在寻找一些系统的修复方法,而不是解决办法(例如,使用不同的变量而不是工作的i )。

我还检查了生成的程序集代码,在VS2013中,它似乎使用整个128位注册表在一个部门中执行4个浮点操作。在VS2015中,它似乎只执行两个浮点操作,而注册表的其余部分为零(或一些垃圾),这可能会导致此异常。

导致异常的指令在图片中标记。

VS2013

和VS2015

任何帮助都将不胜感激。谢谢。

EN

回答 1

Stack Overflow用户

发布于 2016-10-11 10:46:33

这看起来是与您使用浮点异常的交互,但也支持一些浮点优化。

代码所做的是一次执行2次迭代(循环展开),但使用divps,它同时执行4次除法(从XMM寄存器中的4次浮动)。XMM寄存器中的上层2浮点数不被使用,而是为零。由于这些插槽中的值不被使用,所以通常并不重要。但是,当您设置自定义异常处理时,会引发一个无效的op异常,即使它生成的值不被使用,也会看到该异常。

正如我所看到的,您的选择是设置/fp:strict,这将禁用优化,从而使此工作(但显然会使代码变慢)或删除controlfp调用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39974255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档