Python:为什么2 ^ -n适用于n> 52而不是1 + 2 ^ -n-1?

时间:2018-01-26 17:35:47

标签: python numpy math floating-point

我对python很陌生,我已经制作了一个计算T=1+2^-n-1C=2^n的表格,它们都提供了从n=40到{n=52的相同值{1}},但对于n=52n=61T得到0.0,而C每次给我的小数逐渐变小 - 为什么会这样?

我想我理解为什么T变为0.0,因为python使用二进制浮点并且因为机器的epsilon值 - 但我对于为什么C没有&#39感到有些困惑; t也变为0.0。

import numpy as np
import math
t=np.zeros(21)
c=np.zeros(21)
for n in range(40,61):
    m=n-40
    t[m]=1+2**(-n)-1
    c[m]=2**(-n)
    print (n,t[m],c[m])

2 个答案:

答案 0 :(得分:1)

浮点数中的“浮动”表示通过存储固定数量的前导数字和比例因子来表示值,而不是假定固定比例(将固定< / em> point)。

2**-53只需要一个(二进制)数字来表示(不包括比例),但1+2**-53将用54来表示。 Python float只有53个二进制数字的精度; 2**-53可以完全表示,但1+2**-53四舍五入到1,从中减去1恰好为0.因此,我们有

>>> 2**-53
1.1102230246251565e-16
>>> 1+(2**-53)-1
0.0

后记:你可能想知道为什么2**-53显示为一个不等于精确数学值的值,当我说它是精确的时。这是由于float-&gt;字符串转换逻辑,它只保留足够的十进制数字来重建原始浮点数(而不是在末尾打印一堆通常只是噪音的数字)。

答案 1 :(得分:0)

两者之间的差异确实是由于浮点表示。实际上,如果你执行1 + X,其中X是一个非常小的数字,那么浮点表示将其指数值设置为0,精度由尾数确保,在64位上为52位电脑。因此,1 + 2^(-X)如果X > 52 等于为1.但是,即使2^-100也可以用双精度浮点表示,因此您可以看到C减少对于更多的样本。