对于我的应用程序(数值计算),对于相同的输入,调试和发布可执行文件返回完全相同的结果是很重要的.我一直在追查它们之间的一个新的差异,发现这是GCC的错,GCC将sin
和cos
的计算合并到一个对sincos
的调用中,结果得到的sin
值与常规对sin
的调用返回的值不同.一些谷歌搜索告诉我,这是有可能发生的.
很好,我决定不使用sincos
,或者不让编译器使用它.在Godbolt上,我提供了以下代码
#include <stdio.h>
#include <math.h>
int main()
{
double d;
scanf("%lf", &d);
double sd = sin(d);
double cd = cos(d);
printf("%f, %f", sd, cd);
return 0;
}
以及下面的标志-O3 -fno-builtin-sincos
.这不管用,GCC仍然向sincos
发出呼叫.但是,如果我将标志替换为普通的-fno-builtin
,则GCC服从并分别调用sin
和cos
.
为了完整,我也try 了-fno-builtin-sincos -fno-builtin-sincosf -fno-builtin-sincosl
,没有骰子.
这是GCC的虫子吗?