浮点数精度丢失问题
在MATLAB中,直接在命令行输入 0.1+0.2==0.3
,返回的结果是false(逻辑0),如图
导致这种结果的原因是:在软件的底层世界里,只有0
和1
两种二进制编码,而大部分小数以这种二进制编码保存时,是会丢失精度的。所以实际上计算机中保存的0.1
已经不是0.1
了,同样0.2
也不是0.2
了,进一步保存的0.1+保存的0.2
得到的结果与0.3
是有误差的(0.3
也不是真正以0.3
保存的,也是有误差的。这里由结果可以看出:保存的0.1+保存的0.2≠保存的0.3
)。
这里的大部分小数是除1/2, 1/4, 1/8, 1/16, ... 1/2^(n)
以及它们的任意组合之外的小数,而1/2, 1/4, 1/8, 1/16, ... 1/2^(n)
等是可以精确保存的,即不丢失精度。例如我们可以判断 0.5+0.25==0.75
:
程序中遇到类似问题的解决办法
最近在写程序,需要判断程序是否在特定条件下终止,就遇到了浮点数精度丢失问题,简而言之,可以用下面概括:
在经过上面3步操作后(简化为分别给
a1, d, a2
赋值),我又经过了其他的一些操作。现在我要判断a2-a1<=d
是否成立,成立则退出,不成立则继续运行。现在判断:可以看到,我们预期的结果应该是true(逻辑1)
,然而程序返回的却是false
,有方法解决吗?答案是有的。即换个方式:
你知道其中的原理吗?
关于机器学习、算法、Python、计算机等更多内容,请关注微信公众号: