如何在Python中表示无限大的数字?

776

我如何在Python中表示无限大?无论您在程序中输入哪个数字,都不应比这个无限大的表示更大。


54
math.inf在优化问题中作为初始值非常有用,因为它能正确地与min函数配合使用,例如min(5, math.inf) == 5。比如,在最短路径算法中,您可以将未知距离设置为math.inf而不需要特殊处理None或假定一个上限9999999。同样地,对于最大化问题,您可以使用-math.inf作为起始值。 - Colonel Panic
1
在大多数情况下,在优化问题中使用math.inf的替代方法是从第一个值开始。 - Tobias Bergkvist
2
不禁想知道为什么这么多Python问题似乎吸引了许多做同一件事情的方法。这符合Pythonic或与Python之禅兼容吗? - nyholku
1
@nyholku 同意.. 应该有一种--最好只有一种--明显的方法来做到这一点。 - Sнаđошƒаӽ
@nyholku,在我看来,这里的答案都实质性地建议做同样的事情。无论您是在math标准库中将其作为常量访问还是通过请求float类型解析字符串"inf",浮点无穷大都是相同的内置对象。 - Karl Knechtel
13个回答

933

在Python中,你可以这样做:

test = float("inf")

在Python 3.5中,你可以这样做:

import math
test = math.inf

然后:

test > 1
test > 10000
test > x

除非x也是无穷大或“nan”(“不是数字”),否则将始终为真。

此外(仅适用于Python 2.x),与Ellipsis的比较相比,float(inf)更小,例如:

float('inf') < Ellipsis

将返回true。


7
请注意,无穷大的定义在 IEEE 754-1985 标准中(http://en.wikipedia.org/wiki/IEEE_754-1985),这是任何现代语言都会依赖的。另一个要点是,根据此标准,无穷大必须(显然)是浮点数。这可能解释了为什么 Python 选择了这种奇怪的语法。 - quickbug
3
而且你可以使用-float("inf")来获得负无穷,它比任何其他数字都要小。 - Sergey Zakharov

112

自 Python 3.5 开始,您可以使用 math.inf

>>> import math
>>> math.inf
inf

100

似乎没有人明确提到负无穷大,所以我认为我应该补充一下。

对于负无穷大:

-math.inf

对于正无穷(仅为完整起见):

math.inf

6
float("inf")math.infnp.inf有什么区别?在何时使用它们?这三者都代表正无穷大(positive infinity),但是它们的具体实现略有不同。float("inf")是一个Python内置的浮点型常量,math.inf是Python标准库中math模块的浮点型常量,而np.inf是NumPy库中的浮点型常量。如果你只需要简单地表示正无穷大,可以使用任意一种方式。但是,如果你需要在数学计算中使用正无穷大,建议使用NumPy库中的np.inf。因为NumPy提供了更多的数值运算函数和工具,使得使用np.inf更加方便和高效。 - CGFoX
3
如果您不想加载包,可以使用第一个选项,这就是它的高度。 - ajsp
@stefanbschneider 在底层,它们都使用IEEE 754浮点标准规定的相同的无穷浮点表示法。因此,它们本质上都是相同的。在我的机器上,使用timeit,float('inf')大约需要185纳秒,而numpy和math版本都需要约70纳秒。这可能是因为float('inf')需要解析字符串并执行一些检查。这么小的时间几乎总是太小而无法进行优化,但由于它们输入更快,我不明白为什么你会选择使用float('inf')选项。 - undefined

34

我不确定你具体在做什么,但是float("inf")会给你一个浮点数无穷大(Infinity),它比任何其他数字都要大。


33

NumPy库中存在一个无穷大:from numpy import inf。要获取负无穷大,只需写 -inf


2
float("inf")math.infnp.inf之间有什么区别?应该在何时使用它们? - CGFoX
1
前两个是本地的,即不需要依赖。np.inf需要Numpy包。float('inf')有点hacky,因为它涉及解析字符串,但好处是它甚至不需要导入,并且解析通常在计算上可以忽略不计。如果您无论如何都使用其中一个数学包,则只需使用它们。如果您碰巧同时使用mathnp,则np.inf是最短的一个。 - Lenar Hoyt

27

另一种不太方便的方法是使用Decimal类:

from decimal import Decimal
pos_inf = Decimal('Infinity')
neg_inf = Decimal('-Infinity')

31
为什么您不加上“为什么它不太方便以及为什么任何人都应该使用它”的解释呢? - Niccolò
5
我们来看一下:Decimal('Infinity') == float('inf') 的返回值是 True,所以它们基本上是一样的。 - Denis Malinovsky
10
float('inf') is float('inf') 的结果也是 False - nemesisdesign
6
我认为你的评论并没有太多意义,因为无限甚至与自身都不同。 - nemesisdesign
10
float('inf') is float('inf') 的翻译是 False,这只表明它们是不同的对象实例,但并不表示它们内部内容不同。实际上,像 @nemesisdesign 所指出的那样,float('int') == float('int')True。这和比较可变对象如 [1,2,3] is [1,2,3][1,2,3] == [1,2,3] 是一样的问题,分别返回 FalseTrue。更多信息请参见:https://dev59.com/F3A75IYBdhLWcg3w_uqD。 - Manoel Vilela
显示剩余5条评论

16

Python2.x中有一个肮脏的Hack,可以用来实现这个目的(除非绝对必要,否则永远不要使用):


None < any integer < any string

因此,对于任何整数i,检查i <''都成立。python3已经合理地弃用了这种方法。现在这样的比较结果为:

TypeError: unorderable types: str() < int()

6
如果你真的需要使用这个代码,至少将其封装在易读的变量名中,例如: MIN_INFINITY = None; INFINITY = "inf"; MIN_INFINITY < x < INFINITY - Ali Rasim Kocal
6
但是你不必使用这个。 - Joost

13

无穷大

1. 使用 float('inf')float('-inf)

positive_infinity = float('inf') 
negative_infinity = float('-inf')

2. 使用Python的math模块

import math
 
positive_infinity = math.inf 
negative_infinity = -math.inf 

3. 整数 maxsize

import sys

maxSize = sys.maxsize 
minSize = -sys.maxsize 

4. 使用Python的decimal模块

from decimal import Decimal
 
positive_infinity = Decimal('Infinity') 
negative_infinity = Decimal('-Infinity') 

5. 使用Numpy库

from numpy import inf

positive_infinity = inf 
negative_infinity = -inf 

12

如果您使用 SymPy,您可以使用 sympy.oo

>>> from sympy import oo
>>> oo + 1
oo
>>> oo - oo
nan

等等。


2
对于正无穷大
pos_inf_val = float("infinity")

对于负无穷
neg_inf_val = float("-infinity")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接