如何解决为什么通过除法而不是乘法精确地表示二进制?
>>> 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,双浮点精度。
但是我不了解关于输出的两件事:
- 由于这里只能用二进制精确表示的数字是0.0和0.5,为什么上面打印的不是唯一的精确数字?
- 为什么两个列表理解的评价结果不同?
解决方法
此处的关键点是10
完全用二进制表示,而0.1
则不是。除以10可获得每个分数的最接近的表示形式;乘以不精确的转换0.1不能保证精度。有时您会“足够接近”以将结果四舍五入到小数点后一位,有时甚至没有。
有足够的理由吗?
,回答每个问题:
- 由于这里只能用二进制精确表示的数字是0.0和0.5,为什么上面打印的不是唯一的精确数字?
Python会将所有浮点数的显示四舍五入为在求值时产生相同值的最短文字。因此,是的,这些数字中的许多实际上与它们所代表的实际数字并不相同,但是,如果您在Python中键入这些数字,则无需数学就可以得到该值(略有错误)。
如您所述,
- 为什么两个列表理解的评价结果不同?
0.1
已经不准确,因此乘以它并不等于除以10
(其中至少两个输入都是精确整数)。有时,这种不准确性意味着结果与用10
除法不同;毕竟,您乘以“刚好超过十分之一”,而不是“十分之一”。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。