Answers:
您仍然可以通过涉及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
值静默注入计算中。
**
似乎有点马车。当它用实数溢出时,会引发错误,但是当其任何操作数是inf
或时-inf
,它将返回0.0
或inf
。因此,当输入为无穷大时,它确实可以正常工作,但是当结果为无穷大时,则不能正常工作。
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
,如果您不希望它为真,则必须手动检查它。
-1 * float('infinity') == -inf
我发现到目前为止,没有人提到过一个警告。我不知道在实际情况下是否经常出现这种情况,但这是出于完整性考虑。
通常,计算模无穷大会以浮点数形式返回自己,但分数无穷小会返回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中修复。
1e309
将被解释为+inf
和-1e309
将被解释为-inf
。