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

Ben*_*ish 5 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);
}
Run Code Online (Sandbox Code Playgroud)

编译:

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

结果 :

v1 -> 384.000000000000057
v2 -> 384.000000000000000

Die*_*Epp 4

恭喜,这是一个编译器错误。编译器通过提前评估其中一个cbrt调用来优化您的代码,不幸的是,编译器的版本cbrt与 libm 中的版本不同。您还会注意到,通过也会-O2导致v2结果“错误”(即使在数学上是正确的)。

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

抄送(Debian 6.3.0-5)6.3.0 20170124

应将此错误报告给编译器开发人员(https://gcc.gnu.org/bugs/),但最好先搜索错误存储库。