编者:李国帅
qq:9611153 微信lgs9611153
2012-10-3
背景原因:
随着时间的推移技术的更新,许多的知识在改变,但是人的想法未必跟着改变。
做这一行的人,未必一定要紧跟时代,但是却不能有固步不前的想法。
问题描述及期望效果:
记得以前总是使用if(xxx==0.000001)判断一个浮点数,这样正确吗?
所需资源:
VC
先看一下浮点数的实际大小:
内存跟踪发现浮点数的真实大小是会发生变化的。
/*
fy1 0.020000000 float
fy2 1.9999999e-005 float
fy3 2.0000000e-006 float
fy4 2.0000000e-007 float
fy5 2.0000000e-010 float
dbly1 0.020000000000000000 double
dbly2 2.0000000000000002e-005 double
dbly3 1.9999999999999999e-006 double
dbly4 1.9999999999999999e-007 double
dbly5 2.0000000000000001e-010 double
fx1 0.0099999998 float
fx2 9.9999997e-006 float
fx3 1.0000000e-006 float
fx4 1.0000000e-007 float
fx5 1.0000000e-010 float
dblx1 0.010000000000000000 double
dblx2 1.0000000000000001e-005 double
dblx3 9.9999999999999995e-007 double
dblx4 9.9999999999999995e-008 double
dblx5 1.0000000000000000e-010 double
*/
比较分析:
进一步测试,发现自己对浮点数的理解是片面的,
真实的情况是:如果两个非0数(a=1.0f和b=1.0f)进行比较的话,它们可能相同,也可能不同。
对于float,是将数据使用科学计数法表示之后,小数点后面的6位是正确的真实的,第7为是进位之后的数据,不是精确数据。因此让两个float一定相等,前9个有效数字必须相等。
也就是说1.000000010f和1.000000019f是相等的,而0.0000001f和1.0000001f可能不相等。
对于double,是将数据使用科学计数法表示之后,小数点后面的14位是正确的真实的,第15为是进位之后的数据,不是精确数据。因此让两个double一定相等,前17个有效数字必须相等。
/*
dblx0 1.2345678901234570e+18 double
dblx1 1.2345678901234568e+18 double
dblx2 1.2345678901234565e+18 double
dblx3 1.2345678901234565e+18 double
dblx4 1.2345678901234563e+18 double
dbly1 1.2345678901234563e+18 double
dbly2 1.2345678901234560e+18 double
fx0 1.23456794e+09 float
fx1 1.23456781e+09 float
fx2 1.23456781e+09 float
fx3 1.23456781e+09 float
fx4 1.23456781e+09 float
fy1 1.23456781e+09 float
fy2 1.23456781e+09 float
fx0 == fx1=0
fx0 == fx2=0
fx0 == fx3=0
fx0 == fx4=0
fx2 == fx1=1
fx3 == fx4=1
fy1 == fy2=1
dblx1 == dblx0=0
dblx2 == dblx0=0
dblx3 == dblx0=0
dblx4 == dblx0=0
dblx1 == dblx2=0
dblx3 == dblx4=0
dbly1 == dbly2=1
请按任意键继续. . .
*/