對于下面的代碼,我希望范圍停止在值 1.0,但它一直上升到 1.099999...,這是有道理的,因為它是一個浮點值。創建步長為 0.1 的范圍的更好方法是什么?import numpy as npstart = 0.5stop = 1.0step = 0.1for parameter_value in np.arange(start, stop + step, step): print(parameter_value)輸出0.50.60.70.79999999999999990.89999999999999990.99999999999999991.0999999999999999
2 回答

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

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