2014-12-05 62 views
3

我在我的程序中使用-Ofast gcc选项导致延迟需求。我写了简单的测试程序: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 

所以!===结果不能被信任。这是否意味着只有当这两个值都不是南时,我才应该==!=,否则我应该先用isnan进行测试?

确保isnan-Ofast正常工作? ==!=如何正确工作与-Ofast双? 有人可以提供由-Ofast添加的完整限制列表吗?

+0

为什么你首先使用-Ofast?你读过文档了吗?它与-O3 -ffast-math相同,其中-ffast-math表示你不关心float/double只要速度很快就会给出错误结果...... – 2014-12-06 09:02:49

回答

7

您正在观察-ffast-math的影响。

docs

-Ofast

否认严格符合标准。 -Ofast启用所有-O3优化。它也 使优化不适用于所有符合标准的程序。它打开 -fast-math和Fortran特定的-fno-protect-parens和-fstack-arrays。

-ffast,数学

集-fno-数学错误号,-funsafe-数学优化, -fno截留数学,-ffinite,数学只,-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的组合。

+0

我可以使用'isnan'和'-Ofast '?它会起作用吗?或者不能保证,有时候我可以变得真实,有时候会是假的? – javapowered 2014-12-05 12:50:11

+0

你应该完全避免NaN和'-ffast-math'的组合,但是我的猜测是'isnan'的行为将像预期的那样对于显式设置的NaN。即使它做到了,也不要以为它总是会的。 – Praxeolitic 2014-12-05 13:20:08

+0

你知道吗?除了'-fast-math',我应该如何设置'-Ofast'? – javapowered 2014-12-05 13:53:31