【问题标题】:g++ optimization options affect the value of sin functiong++优化选项影响sin函数的值
【发布时间】:2012-03-04 04:56:00
【问题描述】:

我对 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("%.32f\n", yy);

    return 0;
}

在没有任何优化选项的情况下使用“g++”编译上述代码时,它会输出“-0.00000000000000024492127076447545”。 但是如果使用“-O3”选项,它将输出“-0.00000000000000024492935982947064”。

为什么不返回“-0.00000000000000024492935982947064”而不返回“-O3”? 提前致谢。

【问题讨论】:

  • 我可以知道您使用的是哪个版本的 g++ 以及哪个操作系统和硬件吗?
  • g++ 4.4.3、ubuntu 10.04 和 Intel(R) Core(TM) i3-2310M CPU @ 2.10GHz。谢谢。
  • 也许可以查看-ffast-math 选项。
  • -Ofast 在这里也值得一提。
  • -ffast-math 对结果没有影响。 -Ofast 不是 g++ 的有效选项参数。

标签: c++ c


【解决方案1】:

因为使用“-O3”,编译器会在编译时使用一种算法预先计算sin(2*pi)。如果没有“-O3”,这是在运行时使用其他算法计算的。

这可能是因为编译器本身是用一些数学库构建的,与您的数学库不同。

更新

给出结果“-0.00000000000000024492127076447545”的唯一实体是 32 位版本的 libstdc++。同一库的 64 位版本以及 gcc 本身会产生“-0.00000000000000024492935982947064”。

因此升级到较新版本将无济于事。我也尝试了各种选项,在这里提出:-ffloat-store 和 -fno-builtin 都没有任何区别,以及 long double 和 sinl。

32 位 libstdc++ 使用 387 个浮点指令,而 gcc 显然使用 SSE 指令。这就是区别。可能,使它们保持一致的唯一方法是从源代码重建 gcc,指示它在内部仅使用 387 条指令。

【讨论】:

  • 感谢您的回答。你知道在运行时是否可以得到“-0.00000000000000024492935982947064”?以及如何?
  • @Sanders -fno-builtin 确保没有使用内置函数,这通常有助于避免在编译时计算结果。但是,您得到的结果仍然不正常,编译器或库中可能存在错误。您应该尝试更新到新版本。
  • @ouah 好的,我会更新我的 g++ 版本并试一试。谢谢。
  • 我的 gcc 4.6.1 在所有情况下都给出 -0.00000000000000024492935982947064,所以如果你升级到这个版本或最新版本(编译器和库),你会得到一致的结果。您也可以尝试将它们升级到您的 ubuntu 发行版的默认版本。或者从源代码重新编译 gcc。
  • @EvgenyKluev 太好了。我会试一试。顺便问一下,您的操作系统版本是多少?
猜你喜欢
  • 2012-09-05
  • 1970-01-01
  • 1970-01-01
  • 2016-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多