无穷大和 NaN 比较

lua-users home
wiki

在数值计算中,我们有时需要将数字与无穷大和 NaN(非数字)进行比较。在 C 语言中(例如,在我的 Debian Linux 系统中),`` 中定义了三个函数
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 表中

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

我建议在 math 库中添加三个新函数,它们是 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 (差异)