Python浮动溢出,当浮动溢出时会发生什么?

时间:2016-03-06 22:20:50

标签: python integer-overflow

我正在查看下面代码的输出。当我将1递增到float的最大值时,输出似乎是我所期望的,但是当我执行x = x * 1.5时,我看到inf作为输出,我假设是浮点溢出。我的问题是,从预期输出到inf的上限是多少?

x=sys.float_info.max
x=x+1
x

2 个答案:

答案 0 :(得分:2)

Python float没有足够的精度来存储+ 1的{​​{1}},因此操作实际上相当于添加零。以下比较实际返回sys.float_info.max

True

只有当您开始添加足够大的数字以导致该浮动的IEE754二进制表示形式发生更改时,您才会获得print sys.float_info.max+1==sys.float_info.max ,例如:

inf

在我的机器上返回x+0.00000000000000001E308 (Windows 64位)

答案 1 :(得分:0)

我没有足够的声誉来评论亚历克斯给出的出色答案,但我认为它可能会误导人们带着不同的问题来到这里,那就是在像往常一样增加停止工作时寻找限制(即停止实际增加),实际上要低得多。

在我当前使用 Python sys.float_info.max 的机器上是 1.7976931348623157e+308

使用以下代码进行测试时:

for a in range(300):
  x = float("1.0e"+str(a))
  if x != x+1:
  print(x)

事实证明,由于 significand 的范围有限,对于超过大约 1e+15 的数字,递增停止工作。