我有一个相当简单的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位浮点数。根据我的直觉,我尝试以下操作,我认为应该是相同的:
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
的大师们呼唤——为什么会发生这种情况?
np.arange
的实现似乎会导致这种差异在连续加法中累积,2)如果我使用不同的方法创建数组,仍然使用float64
,那么浮点误差要小得多(在10^-7级别而不是10^-2)。 - VBB