使用np.arange时for循环迭代器为何会超出上界?
为什么
np.arange(0.2, 0.8, 0.01)会生成超过终止值的元素? 这是浮点数精度误差和np.arange的实现逻辑共同导致的,具体原因如下:
1. np.arange的生成逻辑
np.arange不是通过计算(stop-start)/step确定步数,而是通过逐次累加step生成序列:从start开始,每次加step,直到下一个值大于等于stop时停止。但浮点数精度误差会直接影响这一判断,导致最终生成的某个值刚好超过stop的实际存储值,从而被包含在序列中。
2. 浮点数的精度限制
像0.2、0.01这类十进制小数,无法在二进制浮点数中精确表示——它们的二进制是无限循环的,存储时只能取近似值。例如:
- 0.2的实际存储值是
0.20000000000000001110... - 0.01的实际存储值是
0.01000000000000000021...
多次累加这些近似值时,误差会逐步累积。理论上0.2 + 60*0.01 = 0.8,但实际累加后的结果可能是0.8000000000000002...,而0.8本身的存储值是0.8000000000000000444...,此时累加结果就会略大于0.8的存储值,导致你看到i > end为True。
3. 为什么其他组合没出现问题?
浮点数误差的累积方向和大小具有随机性,只有当误差刚好让最后一次累加的结果超过stop的存储值时,才会出现这个现象。其他起始/终止值组合可能刚好误差累积的程度没触发这一情况,但本质上浮点数精度问题一直存在。
内容的提问来源于stack exchange,提问作者wanger
相关产品推荐
相关产品推荐

