>>> 1e100000000
inf
>>> 1000000 ... [400 zeroes snipped] ... 000000
1000000 ... [400 zeroes snipped] ... 000000
>>> 1000000 ... [400 zeroes snipped] ... 000000.0
inf
为什么Python决定大浮点数是无限的?如果表示不能表示该值,我希望它会给出错误,如下所示:
>>> 10.0 ** 1000000000000000000000000000000000000000000000000000000
OverflowError: (34, 'Numerical result out of range')
如果第二个案件抱怨,为什么第一个案件是沉默的?
答案 0 :(得分:5)
因为您尝试创建的浮点数大于浮点值中可表示的最大值。
见sys.float_info
named tuple; sys.float_info.max
是此类值中可表示的最大值。与Python整数不同,Python浮点数的上限由您的操作系统和硬件平台决定,整数受可用内存的限制。
在我的Mac上,最大值为:
>>> import sys
>>> sys.float_info.max
1.7976931348623157e+308
所以带有308个零的1是可表示的,但是带有那么多零的2不是:
>>> float('1' + '0' * 308)
1e+308
>>> float('2' + '0' * 308)
inf
浮点数是有限的,因为浮点运算通常由CPU上的浮点单元处理,而Python的浮点类型仅限于该硬件可以处理的内容。
定义float literal 与将算术应用于浮点值的操作不同;第一个是在编译时确定的,后者是在运行时确定的。文字只能产生SyntaxError
异常,而在运行时你可以抛出其他异常。但是为其他平台上的浮点文字抛出一个语法错误仍然无效,所以不是异常,而是取而代之的是float('inf')
。
Python specification for float literals仅声明允许的范围取决于实现:
允许的浮点文字范围取决于实现。
有一点,计算也会返回float('inf')
,因为一旦你达到无穷大计算很容易(大多数情况下只是给你一种无穷大的形式),但是接近无穷大你会得到溢出。 float exponentiation implementation只使用C pow()
function,当该函数报告溢出时抛出异常。