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

Python:为什么足够大的浮点值是无限的?,python,floating-point,Python,Floating Point,为什么Python决定大浮点数是无限的?如果表示不能表示该值,我希望它会给出一个错误,如下所示: >>> 1e100000000 inf >>> 1000000 ... [400 zeroes snipped] ... 000000 1000000 ... [400 zeroes snipped] ... 000000 >>> 1000000 ... [400 zeroes snipped] ... 000000.0 inf 如果第二种情况

为什么Python决定大浮点数是无限的?如果表示不能表示该值,我希望它会给出一个错误,如下所示:

>>> 1e100000000
inf
>>> 1000000 ... [400 zeroes snipped] ... 000000
1000000 ... [400 zeroes snipped] ... 000000
>>> 1000000 ... [400 zeroes snipped] ... 000000.0
inf

如果第二种情况出现问题,为什么第一种情况会保持沉默?

因为您试图创建一个大于浮点数中可表示的最大值的浮点数

看,
sys.float_info.max
是此类值中可表示的最大值。Python浮点与Python整数不同,它的上限由操作系统和硬件平台决定,整数受可用内存的限制

在我的Mac电脑上,该最大值为:

>>> 10.0 ** 1000000000000000000000000000000000000000000000000000000
OverflowError: (34, 'Numerical result out of range')
有308个零的1是可表示的,但有那么多零的2不是:

>>> import sys
>>> sys.float_info.max
1.7976931348623157e+308
浮点运算是有限的,因为浮点运算通常由CPU上的浮点单元处理,而Python的浮点类型仅限于该硬件可以处理的内容

定义浮点文字与将算术应用于浮点值是不同的操作;前者在编译时确定,后者在运行时确定。文本只能产生
SyntaxError
异常,而在运行时可以引发其他异常。但是,为在其他平台上仍然有效的浮点文本抛出语法错误并不是一个真正的选项,因此您得到的不是异常,而是
float('inf')

仅声明允许的范围取决于实现:

允许的浮点文字范围取决于实现


有一点是,计算也会返回
float('inf')
,因为一旦达到无穷大,计算就很容易了(大多数情况下只会返回无穷大的形式),但接近无穷大时反而会出现溢出。简单地使用,当该函数报告溢出时抛出异常。

这并没有真正回答我读到的问题:OP询问为什么一个操作返回
inf
,而另一个操作则引发异常。Python开发人员完全有可能使用
10.0**1000
返回无穷大而不是提升,或者解析
1e1000
文本以提升而不是产生无穷大。@MarkDickinson:wheee和
(1e309)**2
给出
浮点('inf')
(1e308)**2
(小一个零)给出
溢出错误
。看,那是因为
1e309
当然已经是无穷大了。是的,但那是因为
1e309
已经是无穷大了。在某个地方有一些关于这个问题的开放bug报告,但是如果不破坏向后兼容性,很难修复它。有趣。为什么抛出SyntaxError异常不是一个选项?语法错误是否被机器禁止改变?@EliRose:python字节码缓存文件旨在跨平台使用。您可以在64位计算机上创建它,并将其带到具有较小浮动的有限计算机上,而不会出现问题,反之亦然。
>>> float('1' + '0' * 308)
1e+308
>>> float('2' + '0' * 308)
inf