问题: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.0yields 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.0is是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
所以要小心!
