python - 为什么 a//b 和 np.floor(a/b) 产生不同的结果?

标签 python python-3.x numpy floating-point precision

我使用 // 偶然发现了 python 3 的“地板划分”的奇怪边缘行为。经过一些计算,我得出公式 (a1 - a2)//b。使用

a1 = 226.72560000000001
a2 = 0.2856000000000165
b = 1.02
# all types are np.float64

我得到的结果与使用np.floor()时不同:

>>> (a1 - a2) // b
221.0
>>> np.floor((a1 - a2) / b)
222.0

这种差异显然源于浮点计算,但为什么它们的行为不同呢?使用更高精度的计算器,例如 ke!san我可以验证 // 的行为在数学上是正确的,而对于我的计算,np.floor() 将提供正确的结果。

最佳答案

确实 // 结果在数学上是正确的。

但是如果你只是执行 (a1 - a2)/b 你可以看到结果已经四舍五入为 222.0 (由于浮点存储限制,它应该是改为 221.9999999999999936275),因此现在使用 Floor 将返回 222.0

编辑:实际上对于//,首先a1-a2四舍五入为226.44(而不是226.4399999999999935),然后226.44//由于 @Talha Tayyab 的解释(x//y 返回 (x-x%y)//y),1.02 错误地返回 221 而不是 222。< br/> 因此存在两个连续的舍入误差,它们相互补偿并得到正确的结果。

关于python - 为什么 a//b 和 np.floor(a/b) 产生不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76769996/

相关文章:

python - Kivy,如何在 Canvas 中使用数据

Python:循环遍历文件中的url

python - 如何在python中遍历二维列表

python - 将字节转换为int?

python - 对基于坐标的数据进行插值以生成网格

python - 如何在numpy savetxt中使用fmt对齐每一列的信息

python - 在 2D numpy 数组中使用 3D 样式切片

python - 从另一列的子字符串创建列

python - 如何在 flask 中获取当前的基本 URI?

python - 权限错误 : [Errno 13] Permission denied: 'C:\\Program Files\\Python35\\Lib\\site-packages\\six.py'