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类型不精确的原因。

你可能感兴趣的:(杂谈&随想,c&c++技术,float,语言,编程,c)