繁体   English   中英

Python 2.7中的浮点数学精度

[英]Floating point math accuracy in Python 2.7

我在理解使用Python 2.7时获得的一些结果时遇到了一些麻烦。

>>> x=1
>>> e=1e-20
>>> x+e
1.0
>>> x+e-x
0.0
>>> e+x-x
0.0
>>> x-x+e
1e-20

这是直接从Python复制的。 我正在上一堂关于如何在Python上编程的课程,但我不理解结果的差异(x + e == 1,x-x + e == 1e-20但x + ex == 0和e + xx = = 0)。

我已经阅读过有关表示错误的Python教程,但我相信那里没有提到

提前致谢

浮点加法不是关联的。

x+ex分组为(x+e)-x 它将xe相加,将结果四舍五入到最接近的可表示数字(为1),然后从结果中减去x并再次四舍五入,产生0。

x-x+e分组为(xx)+e 它从x减去x ,得到0,然后将其四舍五入为最接近的可表示数字,即0。然后将e加到0,得到e ,然后将其四舍五入为最接近的可表示数字,即e

这是因为计算机表示浮点数的方式。

这实际上都是二进制格式,但让我们假设它以10为基数工作,因为与我们联系起来要容易得多。

浮点数以0.x*10^y的形式表示,其中x是10位数字(此处省略尾随零),y是指数。 这意味着数字1.0表示为0.1*10^1 ,数字0.1表示为0.1*10^0

要将这两个数字相加,我们需要确保它们具有相同的指数。 我们可以通过前后移动数字来轻松地做到这一点,即,将0.1*10^0更改0.1*10^0 0.01*10^1 ,然后将它们相加即可得到0.11*10^1

当我们有0.1*10^10.1*10^-19 (1e-20)时,我们将移动0.1*10^-19 20步,这意味着1将落在我们10位数字的范围之外,因此我们将结束用0.1*10^1 + 0.0*10^1 = 0.1*10^1

你在你的最后一个例子结束了1E-20的原因是因为除了完成从左至右,所以我们减去0.1*10^10.1*10^1结束了0.0*10^0 ,并添加0.1*10^-19 ,这是一种特殊情况,我们不需要移动它们中的任何一个,因为其中一个恰好为零。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM