我对python很陌生,我已经制作了一个计算T=1+2^-n-1
和C=2^n
的表格,它们都提供了从n=40
到{n=52
的相同值{1}},但对于n=52
到n=61
,T
得到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])
答案 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减少对于更多的样本。