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 初始化 不一样
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没有进行相应的处理
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之类的进行了近似。
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 初始化 不一样
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没有进行相应的处理
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之类的进行了近似。
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版优化的结果