似乎 IEEE 754 标准将 16,777,214 个 32 位浮点值定义为 NaN,或所有可能值的 0.4%。
我想知道保留这么多有用值的理由是什么,而本质上只需要两个:一个用于信令,一个用于安静的 NaN。
对不起,如果这个问题是微不足道的,我在互联网上找不到任何解释。
似乎 IEEE 754 标准将 16,777,214 个 32 位浮点值定义为 NaN,或所有可能值的 0.4%。
我想知道保留这么多有用值的理由是什么,而本质上只需要两个:一个用于信令,一个用于安静的 NaN。
对不起,如果这个问题是微不足道的,我在互联网上找不到任何解释。
根据IEEE-754 格式的设计者之一威廉·卡汉 (William Kahan ) 的这一系列笔记,使用多个 NaN 旨在让硬件首先填写有关触发 NaN 的信息,以便最终完成的计算导致 NaN 可以运行完成,然后允许程序员编写代码来分析出了什么问题:
IEEE 754 的 NaN 规范赋予它一个位域,软件可以在其中记录 NaN 是如何和/或在何处出现的。该信息对于随后对故障计算的“回顾性诊断”非常有帮助,但现在没有软件可以使用它。通常,该字段已从操作数 NaN 复制到每个算术运算的结果 NaN,或者当未捕获的 INVALID 操作创建新的 NaN 时填充二进制 1000...000。由于缺乏利用它的软件,这种习惯一直在萎缩。
因此,这似乎是故意的并且未指定,以便不同的系统可以以不同的方式处理事情。回想起来,这似乎从未真正发生过,但这似乎是一个合理的想法!
同样还有一个 64 位浮点数的有效载荷,可能值约为 10^15。不幸的是,关于有效载荷应如何在 32 位和 64 位浮点数之间传输并再次返回的实现存在分歧,即您是否保留最高有效位或最低有效位。由于负载处理是特定于机器的,因此您需要不同的代码来处理不同机器上的负载。
我不会太担心在二进制操作之后传播哪个 NaN 有效负载。NaN 是发生概率低的异常值,获得其中 2 个的概率不大。