Numpy float32类型累加后值停在16777216而非理论最大值3.4e38的原因问询
Numpy float32类型累加后值停在16777216而非理论最大值3.4e38的原因问询
这个问题其实和float32的最大值没啥关系,核心是浮点数的精度存储限制在搞鬼,咱们一步步来拆解:
首先先明确两个关键信息:
- 你提到的
numpy.finfo(numpy.float32).max得到的3.4028235e+38是float32能表示的最大数值范围,但这和它能精确表示的整数范围完全是两回事。 float32遵循IEEE 754单精度浮点数标准,它的存储结构里有23位尾数位(加上隐含的1位,总共24位有效二进制位数)。
为什么加到16777216就停了?
2^24的计算结果刚好是16777216——这是float32能精确表示的最大连续整数。在这个数值之前,每一个整数都能找到对应的唯一float32值,所以累加1.0的时候数值会正常增长;但一旦超过这个数,相邻两个可表示的float32数之间的间隔就变成了2.0,也就是说:
- 16777216的下一个可精确表示的
float32数是16777218,中间的16777217是无法被float32精确存储的。
当你的数组a的值达到16777216后,每次执行a += 1.0得到的结果是16777217,但这个值无法用float32精确表示,会被舍入回最近的可表示值——也就是原来的16777216。所以不管你循环多少次,数值都不会再变化了。
你可以直接测试验证这个逻辑:
import numpy as np x = np.float32(16777216) print(x + 1.0) # 输出还是16777216.0 print(x + 2.0) # 输出16777218.0
这就能清楚看到,当数值超过16777216后,float32已经无法分辨1的增量了。
备注:内容来源于stack exchange,提问作者Tadas Šubonis
相关产品推荐
相关产品推荐

