簡體   English   中英

Python Infinity-有什么需要注意的地方嗎?

[英]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.powpow**很棘手,因為它的行為不正常。 當兩個實數的結果太高而無法容納雙精度浮點數時(它應返回無窮大),它將引發溢出異常,但是當輸入為inf-inf ,它的行為正確並返回inf0.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.01 / float(-inf)產生-0.01 / float('inf')產生0.0-1/ float(-inf)產生0.0 此外, 0.0 == -0.0true ,如果您不希望它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-324ZeroDivisionError它拋出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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM