微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么通过除法而不是乘法精确地表示二进制?

如何解决为什么通过除法而不是乘法精确地表示二进制?

以下内容揭示了除法与乘法生成数字的方式的差异:

>>> listd = [i/10 for i in range(6)]
>>> listm = [i*0.1 for i in range(6)]
>>> print(listd)
[0.0,0.1,0.2,0.3,0.4,0.5]
>>> print(listm)
[0.0,0.30000000000000004,0.5]

在第二种情况下,0.3的舍入误差约为1e-16,双浮点精度。

但是我不了解关于输出的两件事:

  1. 由于这里只能用二进制精确表示的数字是0.0和0.5,为什么上面打印的不是唯一的精确数字?
  2. 为什么两个列表理解的评价结果​​不同?

解决方法

此处的关键点是10完全用二进制表示,而0.1则不是。除以10可获得每个分数的最接近的表示形式;乘以不精确的转换0.1不能保证精度。有时您会“足够接近”以将结果四舍五入到小数点后一位,有时甚至没有。

有足够的理由吗?

,

回答每个问题:

  1. 由于这里只能用二进制精确表示的数字是0.0和0.5,为什么上面打印的不是唯一的精确数字?

Python会将所有浮点数的显示四舍五入为在求值时产生相同值的最短文字。因此,是的,这些数字中的许多实际上与它们所代表的实际数字并不相同,但是,如果您在Python中键入这些数字,则无需数学就可以得到该值(略有错误)。

  1. 为什么两个列表理解的评价结果​​不同?
如您所述,

0.1已经不准确,因此乘以它并不等于除以10(其中至少两个输入都是精确整数)。有时,这种不准确性意味着结果与用10除法不同;毕竟,您乘以“刚好超过十分之一”,而不是“十分之一”。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。