为什么要为 NaN 保留这么多 float/double 个值?

Why are are so many float/double values reserved for NaN?

编程中一直困扰我的又一件事。

我的问题

所以我一直在研究这个 IEEE-754 Floating Point Converter 一段时间,我发现,当指数设置为最大值时,尾数为零将导致正无穷大或负无穷大(取决于符号设置的内容),所有非零尾数值将导致 NaN(也称为非数字)。

但是,有这么多 NaN 值的具体原因吗?老实说,对我来说,这看起来像是不必要的范围浪费。我明白为什么 NaN 存在 ,但它只是一个奇异值,我从未在任何地方看到 NaN 的“不同种类”之间的区别。

我的想法

这个怎么样:如果指数和尾数都处于最大值,则将该值视为无穷大(正负仍然取决于符号)。这将摆脱 NaN 值,几乎使 floatdouble 类型的范围扩大一倍。

但是现在,我们将 NaN 值放在哪里?好吧,在 IEEE-754 浮点类型中还有一件事可以通过不同的值来实现:零。有 +0-0。他们总是以同样的方式对待,那么为什么不丢弃 -0 并将其视为 NaN?当然,这将要求处理器在出现 0 时始终删除符号,但我认为这对性能几乎没有影响。

我知道标准很可能不会很快改变,但是有什么具体原因可以说明这个系统不会变得更好吗?回到最初的问题:是否有理由考虑如此大的值 NaN

NaN 不是奇异值。

首先,在浮点数据级别(IEEE 754-2008的Table3.1中的Level 2),有两个NaN,一个quiet NaN和一个信号 NaN。这些也出现在表示浮点数据(级别 3)的级别。

其次,作为对浮点数据进行编码的位串(Level 4),有效位域的第一位编码NaN是静默(1)还是信号(0),其余位可以使用对于诊断信息(只要它们对于信号 NaN 不全为零,因为那表示 +∞),根据 IEEE 754-2008 6.2.1:

When encoded, all NaNs have a sign bit and a pattern of bits necessary to identify the encoding as a NaN and which determines its kind (sNaN vs. qNaN). The remaining bits, which are in the trailing significand field, encode the payload, which might be diagnostic information (see above).

例如,这些位可以设置为生成 NaN(或其哈希值)的指令的地址。或者,一个浮点对象数组可能会被初始化为具有特定有效位的 NaN,然后​​程序结果中的任何 NaN 都可以指示它们是来自该初始数据还是在执行期间生成。

我依稀记得 IEEE-754 委员会的一位成员对有效载荷领域有一些其他创造性的用途,但我不记得它是什么了。