【问题标题】:In Lua, what is #INF and #IND?在 Lua 中,#INF 和 #IND 是什么?
【发布时间】:2013-10-01 03:10:49
【问题描述】:

我对 Lua 还很陌生。在测试时我发现了#INF/#IND。但是,我找不到很好的参考资料来解释它。

什么是#INF#IND 和类似(例如底片)以及如何生成和使用它们?

【问题讨论】:

标签: c floating-point lua floating-point-conversion


【解决方案1】:

#INF 是无限的,#IND 是 NaN。测试一下:

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

我的 Windows 机器上的输出:

1.#INF
-1.#IND

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

inf
-nan

【讨论】:

  • -1.#IND 是一种特殊的 NaN 模式,称为 INDEFINITE。双精度版本的位模式是0xfff800000000000
【解决方案2】:

扩展@YuHao 已经很好的答案了。

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

【讨论】:

    【解决方案3】:

    @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) 是不能用数值处理的东西,任何涉及它的操作的结果也是 Not-a-number(*)。长话短说……如果一个数字是NaN,将其与自身进行比较将(总是)为假。下面的函数实现了检查NaN是否为最简单的方法:
    local function isNAN(value)
      return value ~= value
    end
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      • 2013-02-23
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 2011-05-18
      相关资源
      最近更新 更多