Lua中#QNAN和#IND有什么区别

时间:2013-12-02 09:55:54

标签: lua nan

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

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

输出

-1.#IND
1.#QNAN

根据我的理解,他们都是安静的非数字,但为什么#QNAN等于-#IND(当我说平等时我的意思是他们打印相同的东西,因为我知道{{1} })

知道NaN != NaNNaN还是#IND有什么好处,如果是,那么有什么好处。

1 个答案:

答案 0 :(得分:7)

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,你通常可以完全忽略它们之间的区别。