为何numpy.arange代码输出至16.01而非预期的16.00?
为什么numpy.arange会输出超出预期的16.01?
嘿,这个问题本质上是浮点数的二进制精度限制在搞怪!我来给你掰扯清楚:
首先得明白numpy.arange的工作逻辑:它是从起始值开始,不断累加步长,直到下一个值大于等于终止值时才停止。但问题出在——像0.01这样的十进制小数,在二进制里是无限循环的,根本没法被精确表示。
你以为每次加的是精确的0.01,但实际上计算机存的是它的近似值。当你从12.01开始累加这个近似的0.01,经过几百次累加后,误差会慢慢累积。到最后,本该停止在16.00的时候,实际得到的数值可能是16.00999999999983之类的(你可以试试去掉格式化,直接打印最后一个i值看看),这个数小于终止值16.01,所以会被arange包含进来。而当你用{num:0.2f}格式化时,这个接近16.01的数就被四舍五入成了16.01。
那怎么解决呢?给你两个靠谱的办法:
- 用整数序列来生成,再转换成小数:
np.arange(1201, 1601) / 100,这样完全避开浮点数累加的精度问题。 - 使用
numpy.linspace,它可以精确控制生成的点数,比如np.linspace(12.01, 16.00, 400)(因为16.00-12.01=3.99,步长0.01的话一共400个点)。
内容的提问来源于stack exchange,提问作者Jp Mohan
相关产品推荐
相关产品推荐

