51

似乎 IEEE 754 标准将 16​​,777,214 个 32 位浮点值定义为 NaN,或所有可能值的 0.4%。

我想知道保留这么多有用值的理由是什么,而本质上只需要两个:一个用于信令,一个用于安静的 NaN。

对不起,如果这个问题是微不足道的,我在互联网上找不到任何解释。

4

3 回答 3

33

IEEE-754 标准将 NaN 定义为指数中全为 1 且有效数为非零的数字。有效数字中的最高位指定 NaN 是信令还是静默。有效数字的剩余位形成所谓的 NaN 的有效负载

每当操作的操作数之一是 NaN 时,结果就是 NaN,结果的有效负载等于 NaN 操作数之一的有效负载。有效载荷保存对于科学计算的效率很重要,至少有一家公司提议将 NaN 有效载荷用于专有用途。

在更基本的术语中,NaN 不携带任何有用的数字信息,并且无论如何都必须保留整个 32 位,因此如果标准中没有定义有效负载,则有效数字中未使用的位将被浪费。

于 2013-11-05T22:50:12.297 回答
20

根据IEEE-754 格式的设计者之一威廉·卡汉 (William Kahan ) 的这一系列笔记,使用多个 NaN 旨在让硬件首先填写有关触发 NaN 的信息,以便最终完成的计算导致 NaN 可以运行完成,然后允许程序员编写代码来分析出了什么问题:

IEEE 754 的 NaN 规范赋予它一个位域,软件可以在其中记录 NaN 是如何和/或在何处出现的。该信息对于随后对故障计算的“回顾性诊断”非常有帮助,但现在没有软件可以使用它。通常,该字段已从操作数 NaN 复制到每个算术运算的结果 NaN,或者当未捕获的 INVALID 操作创建新的 NaN 时填充二进制 1000...000。由于缺乏利用它的软件,这种习惯一直在萎缩。

因此,这似乎是故意的并且未指定,以便不同的系统可以以不同的方式处理事情。回想起来,这似乎从未真正发生过,但这似乎是一个合理的想法!

于 2019-02-09T02:44:35.463 回答
1

同样还有一个 64 位浮点数的有效载荷,可能值约为 10^15。不幸的是,关于有效载荷应如何在 32 位和 64 位浮点数之间传输并再次返回的实现存在分歧,即您是否保留最高有效位或最低有效位。由于负载处理是特定于机器的,因此您需要不同的代码来处理不同机器上的负载。

我不会太担心在二进制操作之后传播哪个 NaN 有效负载。NaN 是发生概率低的异常值,获得其中 2 个的概率不大。

于 2014-05-14T17:00:11.550 回答