无穷大和 NaN 比较 |
|
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 */
Lua(5.0 和 5.1)可以通过一些技巧来处理数值无穷大,而不会出现问题。我们可以将一个新的常量包含在 math 表中
math.inf = 1/0 --> inf
之后,我们可以在计算中使用它(即使是 -math.inf 的形式)
x = 3 print(x/0 == math.inf) --> true print(math.log(0) == -math.inf) --> true
math.nan = 0/0 --> nan x, y = 0, 0 print(x/y == math.nan) --> false
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 中不会很困难。此外,它们在代码中的体积很小。
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