gcc -Ofast - 完整的限制列表
gcc -Ofast - complete list of limitations
我在程序中使用 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
的组合。
- Pybind11:将元组列表从Python传递到C++
- 从链接列表c++中删除一个项目
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- C++如何通过用户输入删除列表元素
- 读取文件的最后一行并输入到链接列表时出错
- 复制列表初始化的隐式转换的等级是多少
- LNK2038、MSVS2017 MAGMA的原因列表
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 没有为自己的结构调用列表推回方法
- 使用简单类型列表实现的指数编译时间.为什么
- 一对向量构造函数:初始值设定项列表与显式构造
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 通过for循环使用用户输入填充列表
- C++:如何使函数只返回作为列表一部分的字符串
- 概念中的cv限定符需要表达式参数列表
- 下面是我为检测链接列表中的循环而制作的代码
- 建议在运行时将带有类实例的列表从c++导入qml
- 如何维护资源管理器项目视图中当前可见的项目列表
- 在卡萨布兰卡形成编码参数的列表
- gcc -Ofast - 完整的限制列表