c-简单的Windows程序在Linux终端中运行,但不在Windows cmd中运行



我试图使用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());

最新更新