为什么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
恭喜,这是一个编译器错误。编译器通过提前评估其中一个cbrt调用来优化您的代码,不幸的是,编译器的版本cbrt与 libm 中的版本不同。您还会注意到,通过也会-O2导致v2结果“错误”(即使在数学上是正确的)。
我确认我的系统上存在该错误
抄送(Debian 6.3.0-5)6.3.0 20170124
应将此错误报告给编译器开发人员(https://gcc.gnu.org/bugs/),但最好先搜索错误存储库。