gcc -Ofast - 完整的限制列表

gcc -Ofast - complete list of limitations

本文关键字:列表 -Ofast gcc      更新时间:2023-10-16

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

#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 = %fn", newValue); 
    printf("curValue = %fn", curValue); 
    printf("isnan(newValue) = %dn", isnan(newValue)); 
    printf("isnan(curValue) = %dn", isnan(curValue)); 
    printf("newValue == curValue %dn", (newValue == curValue)); 
    printf("newValue != curValue %dn", (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添加的限制的完整列表吗?

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

从文档中:

-奥法斯特

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

-

ffast-math

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

-仅有限数学

允许对浮点算术进行优化,这些算法假定参数和 结果不是 NaN 或 +-Infs。

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

-

ffast-math 和 isnan 的问题

此外,比较严格的 IEEE 浮点总是会导致 false。

检查双精度(或浮点数(是否为 NaN C++

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

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