無窮大與 NaN 比較

lua-users home
wiki

在數值計算中,有時我們想要比較數字與無窮大與 NaN (非數字)。在 C 中 (例如我的 Debian Linux 中),在 <math.h> 中定義了三個函數
int isinf(double value);   /* gives -1 for -inf, 1 for inf, 0 otherwise */
int isnan(double value);   /* gives 1 for NaN, 0 otherwise */
int finite(double value);  /* gives 1 for not NaN and not inf */
具有明確的目的 (類似函數也出現在 Matlab 及其他語言中)。

Lua (5.0 和 5.1) 可以通過一些技巧,毫不費力地處理數值無窮大。我們可以在數學表中包含一個新常數

math.inf = 1/0                   --> inf

為什麼不改用 math.huge 呢?至少在我的系統上,math.huge == 1/0。⸺DavidManura

在那之後,我們可以在計算中使用它 (甚至以 -math.inf 形式)

x = 3
print(x/0 == math.inf)           --> true
print(math.log(0) == -math.inf)  --> true
不過,不能比較 NaN,因為 IEEE 754 規定 (我記得) 任何 NaN 比較都返回 false
math.nan = 0/0                   --> nan
x, y = 0, 0
print(x/y == math.nan)           --> false
因此在 Lua (和直接在 C 中) 中,我們無法測試數值表達式的「NaN」特徵。

實際上,我認為以下方法可行。我們依賴於 NaN 是唯一不與自身相等的數值一說。⸺ DavidManura
local z = 0/0  -- nan
print(z ~= z) --> true

我在數學函式庫中提議三個新函式,它們是 C 中函式的精確鏡像

math.isinf(value)

如果 value 為 +inf,則返回 1,如果為 -inf,則返回 -1,否則返回 false (即使是 NaN)。

數值非常方便:如果符號對我們來說並不重要,那麼兩者都是真值等價的 (儘管在 Lua 的下一個版本中可能不是!?)

math.isnan(value)

如果 value 為 NaN,則返回 true,否則返回 false。

math.finite(value)

如果 value 不是 NaN 也不是 +/-inf,則返回 true,否則返回 false。

由於這些函式幾乎是 C 中函式的鏡像,所以我認為將它們整合到 Lua 中並不會很困難。此外,它們在程式碼中的大小也會很小。

JulioFernandez

不過,在 Lua 中用函式呼叫的開銷寫起來比較簡單,而且我覺得比較清楚。⸺DavidManura
        x == math.huge   -- test for +inf
        x == -math.huge  -- test for -inf
        -- The following assume type(x) == "number":
        x ~= x           -- test for nan
        x > -math.huge and x < math.huge  -- test for finite


最新變更 · 喜好設定
編輯 · 歷史記錄
最後編輯時間為 2006 年 9 月 30 日早上 2:21 GMT (diff)