问题:Python Infinity-任何警告?
因此,Python具有正负无穷大:
float("inf"), float("-inf")
这似乎就像必须要注意的功能类型。我有什么需要注意的吗?
回答 0
您仍然可以通过涉及inf
以下内容的简单算法获得非数字(NaN)值:
>>> 0 * float("inf")
nan
请注意,通常不会inf
通过常规的算术计算获得值:
>>> 2.0**2
4.0
>>> _**2
16.0
>>> _**2
256.0
>>> _**2
65536.0
>>> _**2
4294967296.0
>>> _**2
1.8446744073709552e+19
>>> _**2
3.4028236692093846e+38
>>> _**2
1.157920892373162e+77
>>> _**2
1.3407807929942597e+154
>>> _**2
Traceback (most recent call last):
File "<stdin>", line 1, in ?
OverflowError: (34, 'Numerical result out of range')
该inf
值被认为是具有特殊语义的非常特殊的值,因此最好直接了解OverflowError
异常,而不是将inf
值静默注入计算中。
回答 1
Python的实现很好地遵循了IEEE-754标准,您可以将其用作指导,但是它依赖于其编译所在的基础系统,因此可能会出现平台差异。最近¹,已应用了允许“无限”和“ inf”的修复程序,但这在这里意义不大。
以下各节同样适用于可以正确实现IEEE浮点算术的任何语言,不仅限于Python。
不平等比较
当处理无穷大且大于>
或小于<
运算符时,以下各项算作:
- 任何数字,包括
+inf
高于-inf
- 包括
-inf
以下在内的任何数字+inf
+inf
是既不更高也不降低比+inf
-inf
既不高于也不低于-inf
- 任何涉及的比较
NaN
都是错误的(inf
既不高于也不低于NaN
)
平等比较
当平等的比较,+inf
并且+inf
是平等的,因为是-inf
和-inf
。这是一个参数不休的问题,可能对您有争议,但这是IEEE标准中的内容,Python的行为与此类似。
当然,+inf
不平等,-inf
并且包括NaN
自己在内的所有事物都不平等NaN
。
无穷大计算
除非两个操作数都为无穷大,否则大多数无穷大计算都会产生无穷大,当运算除法或取模或与零相乘时,要记住一些特殊规则:
- 当乘以零(其结果不确定)时,得出
NaN
- 当将任何数字(无穷大本身除外)除以无穷大时,得出
0.0
或为-0.0
²。 - 当将正无穷或负无穷除以正无穷或无负无穷时,结果不确定
NaN
。 - 减去时,结果可能令人惊讶,但遵循常识:
- 做的时候
inf - inf
,结果是不确定的:NaN
; - 这样做
inf - -inf
的结果是inf
; - 这样做
-inf - inf
的结果是-inf
; - 这样做时
-inf - -inf
,结果是不确定的:NaN
。
- 做的时候
- 添加时,同样可能令人惊讶:
- 这样做
inf + inf
的结果是inf
; - 做的时候
inf + -inf
,结果是不确定的:NaN
; - 做的时候
-inf + inf
,结果是不确定的:NaN
; - 这样做
-inf + -inf
的结果是-inf
。
- 这样做
- 使用
math.pow
,pow
或者**
是棘手的,因为它不表现为它应该。当两个实数的结果太大而无法容纳双精度浮点数时(它应返回无穷大),它将引发溢出异常,但是当输入为inf
或时-inf
,它的行为将正确并返回inf
或0.0
。当第二个参数为时NaN
,它将返回NaN
,除非第一个参数为1.0
。还有更多的问题,文档中并未涵盖所有问题。 math.exp
遭受与相同的问题math.pow
。解决此溢出问题的解决方案是使用类似于以下代码:try: res = math.exp(420000) except OverflowError: res = float('inf')
笔记
注1:作为附加的警告,如IEEE标准所定义,如果您的计算结果不足或溢出,则结果将不是不足或溢出错误,而是正负无穷大:1e308 * 10.0
yields inf
。
注意2:因为任何有NaN
收益的计算以及与之的NaN
任何比较NaN
(包括NaN
它本身)false
,都应该使用该math.isnan
函数确定一个数字是否确实是NaN
。
注3:尽管Python支持书写float('-NaN')
,但符号会被忽略,因为NaN
内部没有符号。如果除-inf / +inf
,则结果为NaN
,而不是-NaN
(不存在此类东西)。
注意4:请谨慎使用上述任何内容,因为Python依赖于为其编译的C或Java库,并且并非所有底层系统都能正确实现所有这些行为。如果要确定,请在进行计算之前测试无穷大。
¹)最近是指从3.2版开始。
²)浮点数支持正零和负零,因此:x / float('inf')
保持其符号和-1 / float('inf')
收益率-0.0
,1 / float(-inf)
收益率-0.0
,1 / float('inf')
收益率0.0
和-1/ float(-inf)
收益率0.0
。此外,0.0 == -0.0
is是true
,如果您不希望它为真,则必须手动检查它。
回答 2
所以呢C99。
所有现代处理器使用的IEEE 754浮点表示法具有几个特殊的位模式,分别保留用于正无穷大(符号= 0,exp =〜0,frac = 0),负无穷大(符号= 1,exp =〜0,frac = 0) )和许多NaN(非数字:exp =〜0,frac≠0)。
您只需要担心:某些算术运算可能会导致浮点异常/陷阱,但不仅限于这些“有趣的”常量。
回答 3
我发现到目前为止,没有人提到过一个警告。我不知道在实际情况下是否经常出现这种情况,但这是出于完整性考虑。
通常,计算模无穷大会以浮点数形式返回自己,但分数无穷小会返回nan
(不是数字)。这是一个例子:
>>> from fractions import Fraction
>>> from math import inf
>>> 3 % inf
3.0
>>> 3.5 % inf
3.5
>>> Fraction('1/3') % inf
nan
我在Python Bug Tracker上提出了一个问题。可以在https://bugs.python.org/issue32968上看到。
更新:这将在Python 3.8中修复。
回答 4
非常糟糕的警告: 被零除
在一1/x
小部分,最多x = 1e-323
是inf
但当x = 1e-324
或很少它抛出ZeroDivisionError
>>> 1/1e-323
inf
>>> 1/1e-324
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: float division by zero
所以要小心!