Python中最大浮点数加多少会触发无穷大?技术探究
Python浮点数溢出的临界值分析
Python中规定的最大双精度浮点数可通过公式计算:
l = 2**(1023) * (2 - 2**(-52))
1.7976931348623157e+308
也能直接通过系统内置属性验证该值:
import sys sys.float_info.max
1.7976931348623157e+308
但实际计算时会出现两种截然不同的结果:
乘以极小的增量值,结果仍等于最大浮点数:
1.0000000000000000000000000001 * l1.7976931348623157e+308
乘以稍大的增量值,结果直接变为无穷大
inf:1.00006 * linf
溢出的临界值范围
触发无穷大的临界值介于 sys.float_info.max + 0.5*epsilon 和 sys.float_info.max + 0.51*epsilon 之间,其中epsilon = 2**-52是双精度浮点数的机器epsilon(即浮点数能表示的最小相对精度)。
验证代码
import sys l = sys.float_info.max epsilon = 2**-52 # 结果仍为最大浮点数 (1 + 0.5*epsilon) * l
1.7976931348623157e+308
# 溢出为无穷大 (1 + 0.51*epsilon) * l
inf
原理说明
这是由IEEE 754双精度浮点数的存储规则决定的:
- 双精度浮点数用64位存储,包含52位尾数、11位指数。最大指数对应的尾数最大值是
2 - 2**-52,这就是sys.float_info.max的计算逻辑。 - 浮点数的精度是相对的,
epsilon是最大浮点数l对应的最小可表示增量的比例值,0.5*epsilon*l是这个最小增量的一半。 - 当计算结果超过
l但未超过l + 0.5*epsilon*l时,会被舍入回l;当结果超过这个阈值时,无法用现有浮点数表示,就会溢出为inf。
内容的提问来源于stack exchange,提问作者Herman Jaramillo
相关产品推荐
相关产品推荐

