g++优化选项会影响sin函数的值
g++ optimization options affect the value of sin function
我对libc的"sin"函数有问题。
#include <cmath>
#include <stdio.h>
int main(int argc, char **argv)
{
double tt = 6.28318530717958620000; // 2 * M_PI
double yy = ::sin(tt);
printf("%.32fn", yy);
return 0;
}
当在没有任何优化选项的情况下使用"g++"编译上述代码时,它将输出"-0.0000000000000000 24492127076447545"。但如果使用"-O3"选项,它将输出"-0.0000000000000000 244929395982947064"。
为什么它不返回不带"-O3"的"-0.0000000000000000 244929395982947064"?提前谢谢。
因为使用"-O3",编译器在编译时使用一种算法预计算sin(2*pi)
。如果没有"-O3",这是在运行时使用其他算法计算的。
这可能是因为编译器本身是用一些不同于您的数学库的数学库构建的。
更新
给出结果"-0.0000000000000000 24492127076447545"的唯一实体是32位版本的libstdc++。同一个库的64位版本以及gcc本身会产生"-0.0000000000000000 2449293592947947064"。
因此,升级到新版本并没有帮助。我还尝试了各种选项,在这里提出:-float store和-fno内置都没有任何区别,还有long double和sinl。
32位libstdc++使用387条浮点指令,而gcc显然使用SSE指令。这就是区别。也许,使它们一致的唯一方法是从源代码重新构建gcc,使其在内部仅使用387条指令。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- MacOS 上的 Xcode 11 项目不在一个函数中使用 sin 和 cos:未定义的符号"___sincosf_stret"
- sin cos 函数在大于 90 的度数时给出错误的结果
- 使用SIN和COS函数迭代时,NAN会导致
- 创建快速sin()函数以改善fps?快速sin()函数
- 设置 std::function 变量以引用 std::sin 函数
- sin函数与数学库sin相比不准确
- g++优化选项会影响sin函数的值
- cMath和sin函数的问题