我试图使用GDB"在后台"查看此代码发生了什么。
目前,我的GDB只在linux终端中工作,正如标题中所述,每当我在这里运行这段代码时,我都会得到预期的(逻辑(输出。
我认为问题出在func()
的return
上。
在cmd
中运行相同的代码会给出"不相等",在terminal
中则给出"相等"。为什么会发生这种情况?
我使用gcc
编译代码
这是代码:
#include <stdio.h>
double func(){
double y= 5 ;
return (double)y/3;
/*// Code that works as expected:
double y= (double)5/3;
return y;
*/
}
int main()
{
double x ;
x= (double)5/3;
if (x == func())
printf("%lf equal to %lfn", x ,func());
else
printf("%lf not equal to %lfn", x, func());
return 0;
}
您将编译器生成的常量与运行时生成的计算进行比较,然后使用不同的编译器对它们进行编译,并在不同的环境中运行它们——可能在不同的处理器上,并且您的非确定性代码会产生不同的结果。这应该不会让你感到惊讶。
此外,double
是64位类型,而x86 FPU支持80位浮点。此扩展精度可用于中间计算,但并非所有编译器都能用于编译时间常数或运行时计算。
所有这些都是浮点结果的最低有效位数的不确定性的因素,作为一种规则,比较浮点类型是否相等是不明智的。相反,你可以测试一些可以接受的小差异:
#define EQUALITY_LIMIT FLT_EPSILON
if ( fabs(x - func()) < EQUALITY_LIMIT )
printf("%lf equal to %lfn", x ,func());
else
printf("%lf not equal to %lfn", x, func());