Numpy排列浮点不一致

2024-04-23

我有一个相当简单的 numpy 任务:创建一个长数组,每个元素递增 0.001。当然,np.arange就是答案。我将自己限制为默认精度(float64)。对结果的一个简单检查是数组的每 1000 个元素应该具有相同的小数部分。我通过绘图检查了这一点(参见附图中的蓝线),但事实并非如此。

tmin = 212990552.75436273
tmax = 213001474.74473435
tbins = np.arange(tmin, tmax, 0.001)
plt.plot(tbins[::1000] % 1)

嗯,我想……浮点怪物又来袭了。我的起始值很大,但不是that大到它搞砸了 64 位浮点数。根据我的预感,我尝试了以下方法,我think应该是同一件事:

nbins = tmin + np.arange(0, tmax-tmin, 0.001)
plt.plot(nbins[::1000] % 1)

田田!那里有一个差异。在数组中约 10^7 个元素上,差异单调上升到 0.14。请注意,由于 tmin 是 x.xxx36273,因此我希望所有数字都采用 x.xxx36273 的形式。nbins有那个,tbins才不是。

In [68]: tbins[-1]
Out[68]: 213001474.60374644

In [69]: nbins[-1]
Out[69]: 213001474.74436274

致电numpy那里的专家 - 为什么会发生这种情况?


你基本上是正确的;如果您关心数组元素的精确小数,请使用第二种方法。

在你的第一次尝试中,tbins = np.arange(tmin, tmax, 0.001),您在一次计算中混合了大浮点数和小浮点数。给定元素的精确值计算为前一个元素和0.001。与之前的值相比,这个值总是很大0.001,所以这个求和不会很准确(为了在进行浮点加法时获得最佳精度,两个操作数应该具有相同的数量级)。

在你的第二次尝试中,nbins = tmin + np.arange(0, tmax-tmin, 0.001), 中的总和np.arange(0, tmax-tmin, 0.001)部分都非常准确,因为数量巨大tmin被遗漏了,只在最后添加。最后添加的tmin每个元素的准确性都会很差,这意味着最终每个元素都会通过one操作精度差。将其与第一次尝试进行比较,其中给定元素的值具有所有先前元素的累积误差。也就是说,元素在数组中的位置越靠前,情况就越糟糕(正如您的绘图所证实的那样)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Numpy排列浮点不一致 的相关文章

随机推荐