对于我的应用程序(数值计算),对于相同的输入,调试和发布可执行文件返回完全相同的结果是很重要的.我一直在追查它们之间的一个新的差异,发现这是GCC的错,GCC将sincos的计算合并到一个对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服从并分别调用sincos.

为了完整,我也try 了-fno-builtin-sincos -fno-builtin-sincosf -fno-builtin-sincosl,没有骰子.

这是GCC的虫子吗?

推荐答案

-fno-builtin-sin -fno-builtin-cos编译.

-fno-builtin-sincos告诉GCC不要在源代码中将sincos视为已知的内置函数,但sincos仍然是已知的函数,因此它有权依赖于它们的属性,即它们计算可以通过调用库 routine sincos获得的正弦和余弦.

C++相关问答推荐

不同到达时间的轮询实现

正确的TCP/IP数据包 struct

当输入负数时,排序算法存在问题

如何将常量char*复制到char数组

函数内的局部字符指针

初始变量重置后,char[]的赋值将消失

如何在下面的C代码中正确管理内存?

防止规范模式在C++中 echo 特殊字符

从uint8_t*转换为char*可接受

For循环中的变量行为不符合预期.[C17]

如何用C语言为CLI应用程序编写按键检测系统?

试图创建一个基本的Word克隆,但遇到了障碍

用C++构建和使用DLL的困惑

为什么我在C代码中得到一个不完整的类型?

为什么我的半数组测试和奇数组测试不起作用?(我使用Assert进行调试)

如何在MSVC中使用intSafe.h函数?

RISC-V GCC编译器错误编译ASM代码

如何找出C中分配在堆上的数组的大小?

使用 SDL2 的 C 程序中的内存泄漏

Codewars Kata 掷骰子的不稳定行为