对于下面的代码,我希望范围停止在值 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
提交
取消