奇怪的cbrt()结果在C中的linux上

时间:2017-02-08 21:45:08

标签: c linux double

为什么cbrt()函数的这两个返回值不同?

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main() {
    double nb = 56623104;
    double v1 = cbrt(nb);
    printf("v1 -> %.15f\n",v1);

    double v2 = cbrt((double) 56623104);
    printf("v2 -> %.15f\n",v2);
}

汇编:

  

gcc toto.c -o toto -lm&amp;&amp; ./toto

结果:

  

v1 - &gt; 384.000000000000057
  v2 - &gt; 384.000000000000000

1 个答案:

答案 0 :(得分:3)

恭喜,这是一个编译器错误。编译器通过提前评估其中一个cbrt调用来优化您的代码,遗憾的是,编译器的cbrt版本与您在libm中的版本不同。您还会注意到,传递-O2会导致v2结果为&#34;错误&#34;同样(尽管它是正确的,在数学上)。

我确认我的系统上存在错误

  

cc(Debian 6.3.0-5)6.3.0 20170124

应该向编译器开发人员(https://gcc.gnu.org/bugs/)报告此错误,但首先搜索错误存储库是个好主意。