float不能做精确比较的原因粗解

  在学习c语言的过程中,总是有些老师告诉你浮点型不能做精确相等性的比较,让你作为c语言编程格言告诉你去遵守;但是,却没有告诉为什么float不能做精确相等性比较的原因!这种教书育人的模式,是一种死记硬背的灌输,其实告诉你float在计算机内部的表示,你自然不会认为float是多么精确的数值,也不会认为他们之间可以做很精确的比较了!

 

sizeof(float) = 4 也就是2^32次方

float的范围:

ffloat 32  -3.4*10(-38)~3.4*10(38)
double 64 15-16 -1.7*10(-308)~1.7*10(308)
long double 128 18-19 -1.2*10(-4932)~1.2*10(4932)
参考资料:C程序设计(第二版)

 

 

从这里面可以看到不管如何设计2^32次方所能表示的信息量,去表示10(38)次方的信息量,因为2(32)<10(38),在某些场景下总是不足的,会形成映射上的镂空,不存在对应的东西;同时,由于计算机float类型32Bits不能无限表现出浮点数的小数点后面的位数,,遂就被特殊地“四舍五入”了!

 

这只是由于float类型被数值设计的原因,造成float某些数据区间其值是很不精确的,但并不是所有区间段,在使用的时间仔细选取,其实也可以达到比较好的精度的!

 

 学习东西知道其最根本的东西,就知道由此演化出来的很多表象,其最终的原因都是因为那灯火阑珊处的一个人儿,光死记硬背float不能精确比较的原则,只是学到其皮毛而已,由此也顺便鄙视下某些老师之陋,没有告诉学生以更真的真相,让学生提纲挈领!

 

  不过,对于float的具体数据设计,我也没有了解太多,具体可以去查一些资料,不过我倒是很确信就是因为这样的数据设计,造成了float类型不精确的原因。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值