我对Lua还比较陌生。在测试过程中,我发现了 #INF
/#IND
。但是,我找不到一个很好的参考来解释它们。
#INF
、#IND
以及类似的(如负数)是什么,如何生成和使用它们?
我对Lua还比较陌生。在测试过程中,我发现了 #INF
/#IND
。但是,我找不到一个很好的参考来解释它们。
#INF
、#IND
以及类似的(如负数)是什么,如何生成和使用它们?
#INF
表示无穷大,#IND
表示 NaN。现在来进行测试:
print(1/0)
print(0/0)
我的Windows机器上的输出:
1.#INF
-1.#IND
由于ANSI C中没有这些的标准表示方法,因此您可能会得到不同的结果。例如:
inf
-nan
-1.#IND
是一种特定的 NaN 模式,称为 INDEFINITE
。双精度版本的二进制模式为 0xfff800000000000
。 - njuffa在@YuHao的优秀答案基础上进行扩展。
Lua在将数字转换为字符串时几乎不做任何处理,因为它严重依赖于底层C库的实现。事实上,Lua print
实现调用了Lua的tostring
,而后者(经过一系列其他调用之后)使用lua_number2str
宏,该宏是根据C的sprintf
来定义的。因此最终您将看到C实现用于表示无穷大和NaN的任何表示形式(这可能会根据编译Lua的编译器以及应用程序链接到的C运行时而有所不同)。
@YuHao已经回答了OP所问的有效问题:什么是+/-1.#INF
(+-inf)和-1.#IND
(nan)的含义。
我想在此处添加一些问题/答案的价值,通过扩展来处理--检查--它们(我刚刚需要并学会了):
+/-1.#INF
)是Lua可以表示的最高数字(+/-),语言通过math.huge
提供这样的值。因此,您可以测试一个数字是否为+/-INF:local function isINF(value)
return value == math.huge or value == -math.huge
end
-1.#IND
)是一些无法进行数值处理的内容,任何涉及它的操作的结果也都是非数字(*)。简言之...如果一个数字是一个NaN
,将其与自身进行比较将(总是)为False。下面的函数实现了检查NaN
的最简单方法:local function isNAN(value)
return value ~= value
end
(*): 这个(NaN)在IEEE754标准(浮点数)的某个地方被正式定义。
1/0
,-1/0
和0/0
- Egor Skriptunoff