[英]Python Infinity - Any caveats?
因此,Python具有正負無窮大:
float("inf"), float("-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
,除非第一個參數為1.0
,否則它將返回NaN
。 還有更多的問題,而文檔中並未涵蓋所有問題。 math.exp
遭受同樣的問題math.pow
。 解決此溢出問題的解決方案是使用類似於以下代碼:
try: res = math.exp(420000) except OverflowError: res = float('inf')
注1:作為附加的警告,如IEEE標准所定義,如果您的計算結果不足或1e308 * 10.0
,結果將不是不足或1e308 * 10.0
誤差,而是正負無窮大: 1e308 * 10.0
產生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
為true
,如果您不希望它為true
,則必須手動檢查該符號。
您仍然可以通過涉及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
值靜默注入計算中。
C99也是如此 。
所有現代處理器使用的IEEE 754浮點表示法具有幾個特殊的位模式,分別保留用於正無窮大(符號= 0,exp =〜0,frac = 0),負無窮大(符號= 1,exp =〜0,frac = 0) )和許多NaN(非數字:exp =〜0,frac≠0)。
您只需要擔心的事情:某些算術運算可能會導致浮點異常/陷阱,但不僅限於這些“有趣的”常量。
我發現到目前為止,沒有人提到過一個警告。 我不知道在實際情況下是否經常出現這種情況,但這是出於完整性考慮。
通常,計算模無窮大會以浮點數形式返回自己,但是分數模無窮小會返回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中修復 。
非常糟糕的警告:被零除
以1/x
分數表示,直到x = 1e-323
為止都是inf
但是當x = 1e-324
或ZeroDivisionError
它拋出ZeroDivisionError
>>> 1/1e-323
inf
>>> 1/1e-324
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: float division by zero
所以要小心!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.