浮点数精度丢失问题
在MATLAB中,直接在命令行输入 0.1+0.2==0.3,返回的结果是false(逻辑0),如图

0.1+0.2==0.3
导致这种结果的原因是:在软件的底层世界里,只有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:

0.5+0.25==0.75
程序中遇到类似问题的解决办法
最近在写程序,需要判断程序是否在特定条件下终止,就遇到了浮点数精度丢失问题,简而言之,可以用下面概括:

image.png
在经过上面3步操作后(简化为分别给
a1, d, a2赋值),我又经过了其他的一些操作。现在我要判断a2-a1<=d是否成立,成立则退出,不成立则继续运行。现在判断:
a2-a1<=d
可以看到,我们预期的结果应该是true(逻辑1),然而程序返回的却是false,有方法解决吗?答案是有的。即换个方式:

a2<=a1+d
你知道其中的原理吗?
关于机器学习、算法、Python、计算机等更多内容,请关注微信公众号:

学无止境也