我在理解使用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教程,但我相信那里没有提到
提前致谢
答案 0 :(得分:4)
浮点加法不是关联的。
x+e-x
被归为(x+e)-x
。它会添加x
和e
,将结果舍入到最接近的可表示数字(即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^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
就此而言,这是一个特殊情况,我们不需要移动任何一个,因为其中一个正好为零。