2 回答

TA貢獻1883條經(jīng)驗 獲得超3個贊
您無法以二進制IEEE 754格式精確表示 0.1,這是大多數(shù)現(xiàn)代架構(gòu)在內(nèi)部使用的表示浮點數(shù)的格式。
最接近 0.1 的二進制值僅比真實值稍差一些。當您將這個最接近的近似值添加五次時,誤差將會增加。
根據(jù)文檔np.arange
:
當使用非整數(shù)步長(例如 0.1)時,結(jié)果通常會不一致。最好用于
numpy.linspace
這些情況。
原因是通過夾緊兩端,linapace
可以對累積誤差做出一些保證,而這是arange
不能保證的。使用的每個單獨的步長可能不是最接近的 0.1 二進制表示,但每個元素從開始到結(jié)束linspace
都會盡可能接近。n * 0.1
linapace
對應(yīng)的調(diào)用np.arange(0.5, 1.1, 0.1)
是
np.linspace(0.5, 1.0, 6)
另一個優(yōu)點linspace
是你可以固定點數(shù)。另外根據(jù)arange
文檔(返回值):
對于浮點參數(shù),結(jié)果的長度為
ceil((stop - start)/step)
。由于浮點溢出,此規(guī)則可能會導(dǎo)致out的最后一個元素大于stop。

TA貢獻1804條經(jīng)驗 獲得超8個贊
作為替代方案,您可以利用除法不會產(chǎn)生與迭代加法一樣多的錯誤這一事實。這是浮點運算所能得到的最精確的結(jié)果:
np.arange(5, 11) / 10.0 # => array([0.5, 0.6, 0.7, 0.8, 0.9, 1. ])
(np.linspace
使用非常相似的公式,但只要您使用有理數(shù),上面的代碼在您的用例中可能更容易理解 - 您不必自己計算步數(shù)。)
添加回答
舉報