【问题标题】:What is the difference between #QNAN and #IND in LuaLua中#QNAN和#IND有什么区别
【发布时间】:2013-12-02 21:35:20
【问题描述】:

如果你通过 Lua 解释器运行它

print(0/0)
print(-(0/0))

输出

-1.#IND
1.#QNAN

据我了解,它们都是 Quiet Not-A-Numbers,但为什么 #QNAN 等于 -#IND(当我说相等时,我的意思是它们打印相同的东西,因为我知道 NaN != NaN

知道NaN#IND 还是#QNAN 有什么好处吗?如果是,有什么好处。

【问题讨论】:

  • 不是真正的 Lua 特性,而是底层 C 库的特性。

标签: lua nan


【解决方案1】:

x86 指定了一种特殊类型的 QNaN,即所谓的 QNaN 浮点不定(IA32 Manual 中的第 4.8.3.7 节):

对于浮点数据类型编码(单精度, 双精度和双扩展精度),一种唯一编码 (a QNaN) 保留用于表示特殊值 QNaN 浮点数不定。 x87 FPU 和 SSE/SSE2/SSE3/SSE4.1/AVX 扩展将这些不定值返回为 对一些掩码的浮点异常的响应。表 4-3 显示 用于 QNaN 浮点不定的编码。

这是您的 C 库实现打印为 -1.#IND 的内容。

在您的情况下,0/0 操作会在 FPU 上触发一个屏蔽的无效操作异常,该异常由一个不确定的返回值表示。在 -(0/0) 的情况下,您将此 Indefinite 值作为输入提供给一个否定运算,该运算返回一个 QNaN。

不同的浮点运算给出不同的错误值的原因是为了便于调试。如果有经验的开发人员确切地知道返回的 NaN 值是什么类型,那么她可能能够更轻松地跟踪错误。出于非调试目的,由于 Indefinite 只是一种特殊的 QNaN,您通常可以完全忽略其中的区别。

【讨论】:

    猜你喜欢
    • 2013-02-23
    • 1970-01-01
    • 2015-09-17
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 2020-05-05
    • 2019-08-02
    相关资源
    最近更新 更多