Python 2.7中的浮点数学精度

时间:2015-05-21 00:15:31

标签: python python-2.7 floating-point floating-accuracy

我在理解使用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教程,但我相信那里没有提到

提前致谢

2 个答案:

答案 0 :(得分:4)

浮点加法不是关联的。

x+e-x被归为(x+e)-x。它会添加xe,将结果舍入到最接近的可表示数字(即1),然后从结果中减去x并再次舍入,生成0。

x-x+e被归为(x-x)+e。它从x中减去x,产生0,并将其四舍五入到最接近的可表示数字,即0.然后将e加到0,产生e,并舍入它是最近的可表示数字,e

答案 1 :(得分:2)

这是因为计算机代表floating point numbers的方式。

这一切都是二进制格式,但我们假装它适用于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.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^1中减去0.1*10^1,最后添加0.0*10^0并添加0.1*10^-19就此而言,这是一个特殊情况,我们不需要移动任何一个,因为其中一个正好为零。