这段程序为什么在debug和在release下运行的结果不一样

时间:2022-11-18 23:01:02
float max=0.2f;
float min=200.0f;
BOOL flag;
float ret=log10(max/min);
if(fabs(ret-(int)ret)>0.0f)flag=FALSE;
else flag=TRUE;
if(flag)AfxMessageBox("yds");

在两个版本中运行的结果相反,在debug中运行的结果是对的
不知那位知道是什么原因

10 个解决方案

#1


比较正常
debug 和Release 初始化 不一样

#2


你把float 改为double试试,不知道是不是精度问题

#3


为什末阿?

#4


不要用max,min做变量名。

#5


debug 和Release有很多地方都不一样。

#6


float 是4字节,精度 3.4E +/- 38 (7 digits) 
double是8字节,精度 1.7E +/- 308 (15 digits) 
而fabs返回值是double,与float比较会出现精度问题,但在debug模式,vc会把0.0f转化为double精度进行比较,所以是对的。但在release版本,vc没有进行相应的处理

#7


用以下代码查看
float max=0.2f;
float min=200.0f;
float ret=(float)log10(max/min);
BOOL flag;

float ff = fabs(ret-(int)ret);
int  decimal, sign;
char *buffer;
buffer = _fcvt( ff, 0, &decimal, &sign );
AfxMessageBox(buffer);

if(ff>0.0f)flag=FALSE;
else flag=TRUE;
if(flag)AfxMessageBox("yds");
log10(max/min)de值不是3.000000000而是2.99999999
所以显示的ff为1。
究其原因在于max/min在Debug里返回的值是1000,在release里的不是,而是在函数log10(...)
后才确认其值。估计当作999.9999999之类的进行了近似。

#8


有没有什么好的解决方法

#9


没人能解决吗

#10


可能是release版优化的结果

#1


比较正常
debug 和Release 初始化 不一样

#2


你把float 改为double试试,不知道是不是精度问题

#3


为什末阿?

#4


不要用max,min做变量名。

#5


debug 和Release有很多地方都不一样。

#6


float 是4字节,精度 3.4E +/- 38 (7 digits) 
double是8字节,精度 1.7E +/- 308 (15 digits) 
而fabs返回值是double,与float比较会出现精度问题,但在debug模式,vc会把0.0f转化为double精度进行比较,所以是对的。但在release版本,vc没有进行相应的处理

#7


用以下代码查看
float max=0.2f;
float min=200.0f;
float ret=(float)log10(max/min);
BOOL flag;

float ff = fabs(ret-(int)ret);
int  decimal, sign;
char *buffer;
buffer = _fcvt( ff, 0, &decimal, &sign );
AfxMessageBox(buffer);

if(ff>0.0f)flag=FALSE;
else flag=TRUE;
if(flag)AfxMessageBox("yds");
log10(max/min)de值不是3.000000000而是2.99999999
所以显示的ff为1。
究其原因在于max/min在Debug里返回的值是1000,在release里的不是,而是在函数log10(...)
后才确认其值。估计当作999.9999999之类的进行了近似。

#8


有没有什么好的解决方法

#9


没人能解决吗

#10


可能是release版优化的结果