在Lua中,#INF和#IND是什么?

7

我对Lua还比较陌生。在测试过程中,我发现了 #INF/#IND。但是,我找不到一个很好的参考来解释它们。

#INF#IND以及类似的(如负数)是什么,如何生成和使用它们?


1
1/0-1/00/0 - Egor Skriptunoff
你的Lua构建必须使用浮点类型作为Lua的“number”类型。(默认的Lua构建使用C的“double”类型。)请参阅David Goldberg的《计算机科学家应该了解的浮点运算知识》(http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html)。 - Tom Blodget
3个回答

11

#INF 表示无穷大,#IND 表示 NaN。现在来进行测试:

print(1/0)
print(0/0)

我的Windows机器上的输出:

1.#INF
-1.#IND

由于ANSI C中没有这些的标准表示方法,因此您可能会得到不同的结果。例如:

inf
-nan

3
-1.#IND 是一种特定的 NaN 模式,称为 INDEFINITE。双精度版本的二进制模式为 0xfff800000000000 - njuffa

7

在@YuHao的优秀答案基础上进行扩展。

Lua在将数字转换为字符串时几乎不做任何处理,因为它严重依赖于底层C库的实现。事实上,Lua print实现调用了Lua的tostring,而后者(经过一系列其他调用之后)使用lua_number2str,该宏是根据C的sprintf来定义的。因此最终您将看到C实现用于表示无穷大和NaN的任何表示形式(这可能会根据编译Lua的编译器以及应用程序链接到的C运行时而有所不同)。


6

@YuHao已经回答了OP所问的有效问题:什么是+/-1.#INF(+-inf)和-1.#IND(nan)的含义。 我想在此处添加一些问题/答案的价值,通过扩展来处理--检查--它们(我刚刚需要并学会了):

  • inf+/-1.#INF)是Lua可以表示的最高数字(+/-),语言通过math.huge提供这样的值。因此,您可以测试一个数字是否为+/-INF:
local function isINF(value)
  return value == math.huge or value == -math.huge
end
  • NaN-1.#IND)是一些无法进行数值处理的内容,任何涉及它的操作的结果也都是非数字(*)。简言之...如果一个数字是一个NaN,将其与自身进行比较将(总是)为False。下面的函数实现了检查NaN的最简单方法:
local function isNAN(value)
  return value ~= value
end

(*): 这个(NaN)在IEEE754标准(浮点数)的某个地方被正式定义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接