0.1+0.2!=0.3(浮点数精度丢失问题)

浮点数精度丢失问题

在MATLAB中,直接在命令行输入 0.1+0.2==0.3,返回的结果是false(逻辑0),如图

0.1+0.2==0.3

导致这种结果的原因是:在软件的底层世界里,只有01两种二进制编码,而大部分小数以这种二进制编码保存时,是会丢失精度的。所以实际上计算机中保存的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、计算机等更多内容,请关注微信公众号:

学无止境也

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容