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

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

任何帮助都将不胜感激。谢谢。
发布于 2016-10-11 10:46:33
这看起来是与您使用浮点异常的交互,但也支持一些浮点优化。
代码所做的是一次执行2次迭代(循环展开),但使用divps,它同时执行4次除法(从XMM寄存器中的4次浮动)。XMM寄存器中的上层2浮点数不被使用,而是为零。由于这些插槽中的值不被使用,所以通常并不重要。但是,当您设置自定义异常处理时,会引发一个无效的op异常,即使它生成的值不被使用,也会看到该异常。
正如我所看到的,您的选择是设置/fp:strict,这将禁用优化,从而使此工作(但显然会使代码变慢)或删除controlfp调用。
https://stackoverflow.com/questions/39974255
复制相似问题