实例揭示浮点数的比较:0.0000001f和1.0000001f是否相等

编者:李国帅

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
请按任意键继续. . .


*/

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微澜-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值