为了账号安全,请及时绑定邮箱和手机立即绑定

c语言,浮点数做for循环,然后if判断,为什么0.5的递增就可以输出结果,而其他(例如0.1的递增)就不可以?

c语言,浮点数做for循环,然后if判断,为什么0.5的递增就可以输出结果,而其他(例如0.1的递增)就不可以?

RoughColorText 2016-11-18 00:27:40
如上图,以下是代码#include<stdio.h>int main (){ double a,b,c,d; for(a=-15;a<15;a=a+0.1){ for(b=-15;b<15;b=b+0.1){ if(a+b==8){ for(c=-15;c<15;c=c+0.1){ if(a+c==13){ for(d=-15;d<15;d=d+0.1){ if(c-d==6&&b+d==8){ printf("%f,%f,\n%f,%f\n\n",a,b,c,d); } } } } } } } return 0;}
查看完整描述

4 回答

?
onemoo

TA贡献883条经验 获得超454个赞

正因为浮点数表示得不精确,多次运算后可能会发生数据“漂移”的现象。

实践中判断两个浮点数是否相等通用这样的办法:用两个浮点数差的绝对值和一个很小的数(如0.000001或选择适当的精度)相比较,如果差异比参考值小就认为它们相等。

查看完整回答
反对 回复 2016-11-19
?
陨星复燃

TA贡献6条经验 获得超1个赞

我觉得之前那位说得对,

符点数存储标准IEEE754,

符点数是采用二进制科学计数法来进行存储的,因此,绝大多数的数在计算机中是不能 精确 表示的


查看完整回答
反对 回复 2016-11-18
?
NoBB_

TA贡献13条经验 获得超11个赞

0.5等于2的-1次方,计算机可以准确表示;而0.1,不能精确表示,只能尽量精确; 即c-d或b+d不会是个整数。

查看完整回答
反对 回复 2016-11-18
?
RoughColorText

TA贡献11条经验 获得超10个赞

是和这个有关系吗?

符点数存储标准IEEE754,

符点数是采用二进制科学计数法来进行存储的,因此,绝大多数的数在计算机中是不能 精确 表示的.
如果两个数a b都是常数赋值,这样比较,应该不会有问题,如:double a=5.3,b=5.3;
if ( a == b )
{
printf("a=b\n");
}
这时会输出a=b
如果a或b是经过运算后得到的值,这时就不一定是一个精确的你想要的值了,如:
double b=2.6+2.7,a=5.3;
if ( a == b )
{
printf("a=b\n");
}
这时就不一定能输出a=b了!

那为什么以0.5递增的时候又可以了?

查看完整回答
反对 回复 2016-11-18
  • 4 回答
  • 0 关注
  • 4167 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信