gpt4 book ai didi

python - Numpy arange float 不一致

转载 作者:行者123 更新时间:2023-11-28 20:38:50 28 4
gpt4 key购买 nike

我有一个相当简单的 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)

嗯,我想……浮点怪兽又来袭了。我的起始值很大,但没有大到搞砸 64 位 float 。根据我的预感,我尝试了以下方法,我认为应该是同一个意思:

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 专家求助 - 为什么会这样?

Drift seen in the decimal part - blue line is tbins, green line is nbins

最佳答案

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

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

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

关于python - Numpy arange float 不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40152997/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com