为什么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
答案 0 :(得分:3)
恭喜,这是一个编译器错误。编译器通过提前评估其中一个cbrt
调用来优化您的代码,遗憾的是,编译器的cbrt
版本与您在libm中的版本不同。您还会注意到,传递-O2
会导致v2
结果为&#34;错误&#34;同样(尽管它是正确的,在数学上)。
我确认我的系统上存在错误
cc(Debian 6.3.0-5)6.3.0 20170124
应该向编译器开发人员(https://gcc.gnu.org/bugs/)报告此错误,但首先搜索错误存储库是个好主意。