Python中指数形式数值加1无变化,加2却生效?求解析
为什么给大浮点数加1无变化,加2却生效?
先看你给出的代码:
num = 1.1920928955078124e+16 print(num) # == 1.1920928955078124e+16 print(num + 1) # == 1.1920928955078124e+16 print(num + 2) # == 1.1920928955078126e+16
这个现象的核心原因是Python的float类型是64位双精度浮点数,存在精度限制:
- 双精度浮点数用52位存储尾数(加上隐含的1位,共53位有效精度),这意味着它只能精确表示
2^53以内的整数(约9.007×10¹⁵)。 - 当数值超过
2^53后,相邻两个可被精确存储的浮点数之间的间隔(称为ulp,单位最后位置)会大于1。对于你使用的1.1920928955078124e+16,它处于2^53到2^54的区间内,此时的ulp是2——也就是说,这个范围内的浮点数只能以2为步长被精确表示。
所以:
- 给
num加1后,结果无法被精确存储,会被舍入到最近的可表示浮点数,也就是原数值num; - 给
num加2后,刚好等于下一个可被精确表示的浮点数,因此能得到正确的结果。
你可以用math.nextafter验证这一点:
import math print(math.nextafter(num, float('inf'))) # 输出 1.1920928955078126e+16,和num+2的结果一致
内容的提问来源于stack exchange,提问作者Jack Lantern
相关产品推荐
相关产品推荐

