Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ VS2015与VS2013中的不同优化导致浮点异常_C++_Optimization_Visual Studio 2013_Visual Studio 2015_Floating Point Exceptions - Fatal编程技术网

C++ VS2015与VS2013中的不同优化导致浮点异常

C++ VS2015与VS2013中的不同优化导致浮点异常,c++,optimization,visual-studio-2013,visual-studio-2015,floating-point-exceptions,C++,Optimization,Visual Studio 2013,Visual Studio 2015,Floating Point Exceptions,我举了一个从VS2013到VS2015过渡期间出现的问题的小例子。在VS2015中,进一步提到的代码示例导致浮点无效操作 intmain() { 无符号整数启用位=_EM_溢出| u EM_零除| u EM_无效; _clearfp(); _控制fp_s(0,~enableBits,enableBits); 整数计数=100; 浮点数组[100]; 对于(int i=0;i

我举了一个从VS2013到VS2015过渡期间出现的问题的小例子。在VS2015中,进一步提到的代码示例导致浮点无效操作

intmain()
{
无符号整数启用位=_EM_溢出| u EM_零除| u EM_无效;
_clearfp();
_控制fp_s(0,~enableBits,enableBits);
整数计数=100;
浮点数组[100];
对于(int i=0;i
这只发生在发布模式下,所以它可能是由不同的优化引起的。这段代码是否有问题,或者这是VS 2015中的一个错误

在整个代码库中很难找到这样的问题,因此我正在寻找一些系统性的解决方案,而不是解决方法(例如,使用不同的变量,而不是I,这是可行的)

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

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

VS2013

和VS2015

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

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

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


在我看来,您的选择是设置/fp:strict,这将禁用优化功能,因此可以执行此操作(但显然会使代码变慢)或删除controlfp调用。

Hmm。您的代码在启用完全优化的情况下对我有效(Release/x64)。你的VS是最新的吗?您是否有任何“特殊”编译器设置?我使用了VS2015更新3。我使用标准设置进行发布+优化(最大化速度/O2)和启用内在功能(是/Oi),感谢您的评论。设置为“严格”会有所帮助,但问题是我不知道应该在哪里设置它。我通常有数百个计算文件,不想到处减少。您知道在VS2015和VS2013中会发生什么情况吗?在VS2015和VS2013中,即使在/fp:precise上也可以正常运行?
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;
}