如果你通过Lua解释器运行它
print(0/0)
print(-(0/0))
输出
-1.#IND
1.#QNAN
根据我的理解,他们都是安静的非数字,但为什么#QNAN
等于-#IND
(当我说平等时我的意思是他们打印相同的东西,因为我知道{{1} })
知道NaN != NaN
是NaN
还是#IND
有什么好处,如果是,那么有什么好处。
答案 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,你通常可以完全忽略它们之间的区别。