如何在 Python 中表示无限数?
Posted
技术标签:
【中文标题】如何在 Python 中表示无限数?【英文标题】:How can I represent an infinite number in Python? 【发布时间】:2011-12-08 12:53:54 【问题描述】:如何在 python 中表示无限数?无论您在程序中输入哪个数字,任何数字都不应大于这个无穷大的表示。
【问题讨论】:
math.inf
在优化问题中作为初始值很有用,因为它可以与 min 一起正常工作,例如。 min(5, math.inf) == 5
。例如,在最短路径算法中,您可以将未知距离设置为math.inf
,而无需特殊情况None
或假设上限9999999
。同样,您可以使用-math.inf
作为最大化问题的起始值。
在大多数情况下,在优化问题中使用 math.inf 的替代方法是从第一个值开始。
不禁想知道有多少 Python 问题似乎吸引了多种方式来做同样的事情。那个 Pythonian 或与 Python 的 Zen 是如何兼容的......
@nyholku 同意.. There should be one-- and preferably only one --obvious way to do it.
【参考方案1】:
在 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。
【讨论】:
如果 x 也是 inf 那就不对了。 请注意,无穷大是在标准 IEEE 754-1985 (en.wikipedia.org/wiki/IEEE_754-1985) 中定义的,任何现代语言都将依赖它。另一点是,根据这个规范,无穷大必须(显然)是一个浮点数。这或许可以解释为什么 Python 选择了这种笨拙的语法。 如果 x 是内置的Ellipsis
也不是真的,它比一切都大,包括无穷大。 float("inf") < Ellipsis
返回 True
不确定最后一个,math.inf < ...
或float('inf') > Ellipsis
会抛出TypeError: unorderable types: float() < ellipsis()
,至少对我而言。
我在 3.5。可能是 2.x/3.x 的东西。【参考方案2】:
从 Python 3.5 开始你可以使用math.inf
:
>>> import math
>>> math.inf
inf
【讨论】:
【参考方案3】:似乎没有人明确提到负无穷大,所以我想我应该添加它。
对于负无穷:
-math.inf
对于正无穷大(只是为了完整性):
math.inf
【讨论】:
【参考方案4】:我不知道你在做什么,但是float("inf")
给你一个浮点数,它比任何其他数字都大。
【讨论】:
【参考方案5】:NumPy 库中有一个无穷大:from numpy import inf
。要获得负无穷大,只需写-inf
。
【讨论】:
【参考方案6】:另一种不太方便的方法是使用Decimal
class:
from decimal import Decimal
pos_inf = Decimal('Infinity')
neg_inf = Decimal('-Infinity')
【讨论】:
你为什么不添加为什么它不那么方便,为什么有人应该使用它? 让我们看看:Decimal('Infinity') == float('inf')
返回True
,所以它几乎是一样的。
@afzal_SH float('inf') is float('inf')
也返回False
infinity 甚至与它本身不同,所以你的评论对我来说没有多大意义,恕我直言
float('inf') is float('inf')
-> False
,只是认为它们是具有不同实例的不同对象,而不是内部内容不同——实际上正如@nemesisdesign 指出的那样,float('int') == float('int')
坚持@987654332 @。这与比较可变对象(如 [1,2,3] 是 [1,2,3] 和 [1,2,3] == [1,2,3])是相同的问题,它们依次为 False和 True.. 更多信息请参阅:***.com/questions/2988017/…【参考方案7】:
在 python2.x 中有一个肮脏的 hack 可以达到这个目的(除非绝对必要,否则永远不要使用它):
None < any integer < any string
因此检查 i < ''
对任何整数 i
保持 True
。
它在 python3 中已被合理弃用。现在这样的比较结束了
TypeError: unorderable types: str() < int()
【讨论】:
如果你真的有你用这个,至少用一些可读的名字包装它:MIN_INFINITY = None; INFINITY = "inf"; MIN_INFINITY < x < INFINITY
但你不必使用这个。【参考方案8】:
如果你使用 SymPy,你也可以使用 sympy.oo
>>> from sympy import oo
>>> oo + 1
oo
>>> oo - oo
nan
等等
【讨论】:
【参考方案9】:对于正无穷
pos_inf_val = float("infinity")
对于负无穷
neg_inf_val = float("-infinity")
【讨论】:
【参考方案10】:在python
中表示∞
float("inf")
or float("INF")
or float("Inf")
or float("inF")
or float("infinity")
or float("Infinity")
创建一个 float
对象持有 ∞
你也可以在python
中表示-∞
float("-inf")
or float("-INF")
or float("-Inf")
or float("-infinity")
创建一个持有 -∞
您可以执行算术运算:
infinity = float("inf")
ninfinity = float("-inf")
nan = float("nan")
print(infinity*infinity)#inf
print(ninfinity+infinity)#not a number
print(1/-infinity)#is -0.0
print(nan*nan)# is not a number
print(1/infinity) # is 0.0 since 1/∞ is 0
输出:
$ python3 floating.py
inf
nan
-0.0
nan
0.0
【讨论】:
以上是关于如何在 Python 中表示无限数?的主要内容,如果未能解决你的问题,请参考以下文章