Python:为什么足够大的浮点值无限?

时间:2015-04-14 16:26:10

标签: python floating-point

>>> 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')

如果第二个案件抱怨,为什么第一个案件是沉默的?

1 个答案:

答案 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,当该函数报告溢出时抛出异常。

相关问题