[英]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
。 它将x
和e
相加,将结果四舍五入到最接近的可表示数字(为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^1
和0.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^1
从0.1*10^1
结束了0.0*10^0
,并添加0.1*10^-19
,这是一种特殊情况,我们不需要移动它们中的任何一个,因为其中一个恰好为零。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.