簡體   English   中英

為什么“np.inf // 2”會導致 NaN 而不是無窮大?

[英]Why does “np.inf // 2” result in NaN and not infinity?

我有點失望np.inf // 2評估為np.nan而不是np.inf ,就像正常除法的情況一樣。

我是否有理由錯過為什么nan是比inf更好的選擇?

我將成為僅指出 C 級別實施的人,而沒有任何試圖解釋意圖或理由的人:

*mod = fmod(vx, wx);
div = (vx - *mod) / wx;

看起來為了計算浮點數的divmod (當你做地板除法時調用它)它首先計算模數和float('inf') %2只有NaN才有意義,所以當它計算vx - mod它以NaN結束,所以一切都傳播到 rest 的方式。

所以簡而言之,由於地板除法的實現在計算中使用模數,即NaN ,地板除法的結果也以NaN結尾

樓層划分是根據模數定義的,兩者都構成了 divmod 操作的一部分。

二進制算術運算

底除法和取模運算符通過以下恆等式連接: x == (x//y)*y + (x%y) 樓層除法和取模也與內置的 function divmod(): divmod(x, y) == (x//y, x%y)連接。

對於x = inf ,這個等式不能成立——余數inf % y是未定義的——使得inf // y模棱兩可。 這意味着nan至少與inf一樣好。 為簡單起見, CPython 實際上只實現了 divmod 並通過刪除部分結果來派生 // 和 % ——這意味着//從 divmod 繼承了nan

無窮大不是一個數字。 例如,你甚至不能說無窮大——無窮大是零。 所以你會遇到這樣的限制,因為 NumPy 是一個數值數學 package。 我建議使用符號數學 package 之類的SymPy ,它可以使用無窮大處理許多不同的表達式:

import sympy as sp

sp.floor(sp.oo/2)
sp.oo - 1
sp.oo + sp.oo

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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