gcc -Ofast - 完整的限制列表

时间:2014-12-05 12:30:41

标签: c++ gcc fast-math

我在我的程序中使用-Ofast gcc选项导致延迟要求。我写了简单的测试程序:

#include <iostream>
#include <math.h>

static double quiet_NaN = std::numeric_limits<double>::quiet_NaN();

int main()
{
    double newValue = 130000; 
    double curValue = quiet_NaN; 
    printf("newValue = %f\n", newValue); 
    printf("curValue = %f\n", curValue); 
    printf("isnan(newValue) = %d\n", isnan(newValue)); 
    printf("isnan(curValue) = %d\n", isnan(curValue)); 
    printf("newValue == curValue %d\n", (newValue == curValue)); 
    printf("newValue != curValue %d\n", (newValue != curValue)); 
}

我尝试使用默认标志和-Ofast:

运行它
$ g++ TestPointer.cpp 
$./a.out 
newValue = 130000.000000
curValue = nan
isnan(newValue) = 0
isnan(curValue) = 1
newValue == curValue 0
newValue != curValue 1

$ g++ -Ofast TestPointer.cpp 
$ ./a.out 
newValue = 130000.000000
curValue = nan
isnan(newValue) = 0
isnan(curValue) = 1
newValue == curValue 1
newValue != curValue 0

因此!===的结果无法信任。这是否意味着只有当两个值都不是nan时才应==!=,否则我应该先测试isnan

保证isnan能否正常使用-Ofast==!=-Ofast的双倍有效吗? 有人可以提供由-Ofast添加的完整限制列表吗?

1 个答案:

答案 0 :(得分:8)

您正在观察-ffast-math的效果。

来自docs

  

-Ofast

     

无视严格的标准合规性。 -Ofast启用所有-O3优化。它也是   启用对所有符合标准的程序无效的优化。它打开了   -ffast-math和特定于Fortran的-fno-protect-parens和-fstack-arrays。

  

-ffast-数学

     

设置-fno-math-errno,-funsafe-math-optimizations,   -fno-trapping-math,-finite-math-only,-fno-rounding-math,-fno-signaling-nans和fcx-limited-range。

  

-ffinite-数学仅

     

允许优化浮点运算,假设参数和   结果不是NaN或+ -Infs。

此标记无效的gcc错误报告有几个。

Problems with -ffast-math and isnan

此外,严格的IEEE浮点数的比较总是导致错误。

Checking if a double (or float) is NaN in C++

这不一定适用于-ffast-math,但它解释了您所展示的内容。

gcc没有描述-ffast-math浮动如何工作的正式标准,所以如果你必须假定gcc版本之间的一致性,那么你只需要凭经验计算出细节。更好的是,完全避免NaN-ffast-math的组合。