我正在查看下面代码的输出。当我将1递增到float的最大值时,输出似乎是我所期望的,但是当我执行x = x * 1.5时,我看到inf作为输出,我假设是浮点溢出。我的问题是,从预期输出到inf的上限是多少?
x=sys.float_info.max
x=x+1
x
答案 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
的数字,递增停止工作。