GCC对-O0和-O2给出了不同的数值结果

GCC对-O0和-O2给出了不同的数值结果,c,optimization,gcc,numerical,C,Optimization,Gcc,Numerical,我使用的是4.1.2。有人知道我的代码中最好的地方吗?有共同原因的经验吗?我正在努力消除一些难看的指针类型转换(即,d=(double)(*(float*)p),其中p是指向int的指针),但还没有运气。 不管它值多少,-O0给出了正确的答案。谢谢您的帮助。我会检查是否存在严格的别名问题,如下所示: 在不知道代码具体做什么的情况下,提到“丑陋的指针强制转换”让我怀疑别名问题 如果您提供了一些代码来演示这个问题,这将对您有所帮助,并使我们更容易回答。谢谢大家,-fn没有严格的别名(几个人建议)解

我使用的是4.1.2。有人知道我的代码中最好的地方吗?有共同原因的经验吗?我正在努力消除一些难看的指针类型转换(即,d=(double)(*(float*)p),其中p是指向int的指针),但还没有运气。

不管它值多少,-O0给出了正确的答案。谢谢您的帮助。

我会检查是否存在严格的别名问题,如下所示:

在不知道代码具体做什么的情况下,提到“丑陋的指针强制转换”让我怀疑别名问题


如果您提供了一些代码来演示这个问题,这将对您有所帮助,并使我们更容易回答。

谢谢大家,-fn没有严格的别名(几个人建议)解决了我的问题。谢谢你的帮助。

经验教训:始终使用警告标志进行编译。

您能否提供一个最低限度(非)工作示例?您是否使用-Wall和-Wextra进行编译?抱歉,我正在处理。沉重的负担。是自动最小化测试用例的优秀工具。另一个导致优化结果略有不同的因素是x86 FPU的精度高于指定值,因此,在操作之间强制将值写入堆栈帧的未优化代码将截断较低的位。坏线是(p1+dcb.ntrc\U hdr+rNTW+t)=*(int*)&ftmp;堆栈溢出不是一个论坛。由于许多原因,如投票和编辑,答案可能会重新排序,因此不应用于答复其他答案。请留下评论或编辑问题。此外,如果您的问题因回答而得到解决,请将其标记为已接受(单击投票计数器下的绿色复选标记)。别忘了投票选出有用的答案!