NaN有两种类型:signaling_NaN、quiet_NaN和..南本身

There are 2 kinds of NaN: signaling_NaN, quiet_NaN, and... NAN itself?

本文关键字:NaN quiet 类型 signaling 两种      更新时间:2023-10-16

我一直认为NaN有两种:安静NaN和信号NaN。

但是后来我意识到NAN宏的计算结果既不是。

在Visual c++中,std::numeric_limits<float>::quiet_NaN()显示为1.#QNAN000
在Visual c++中,std::numeric_limits<float>::signaling_NaN()显示为1.#QNAN000
然而在Visual c++中,NAN显示为-1.#IND0000

  1. 那么NAN常数是什么样的NaN呢?是发信号还是不发信号?

  2. 什么时候我应该使用NAN而不是其他的,什么时候我应该避免它,为什么?

您的机器没有NaN信令。我认为#QNAN中的Q代表安静。检查numeric_limits::has_signaling_NaN。对于signaling_NaN,标准是这样说的:

对于has_signaling_NaN != false的所有专门化都有意义。专业必修is_iec559 != false

因此,它可能是必需的,但却没有意义…自然要做的是提供一个安静的NaN。

我还没有找到QNANIND的权威资源,但它们似乎都是安静的nan。可能有数百万个不同的nan,每个尾数值对应一个。如果我猜,IND可能像一个错误代码的‍终止值,例如0/0。对于通用的NAN宏来说,这并不是一个合适的选择,但是在以这种方式定义C数字绑定之后,他们可能会坚持使用它。