g++优化选项会影响sin函数的值

g++ optimization options affect the value of sin function

本文关键字:函数 sin 影响 优化 选项 g++      更新时间:2023-10-16

我对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条指令。