为什么IEEE 754保留了如此多的NaN值?

时间:2013-11-05 22:34:19

标签: floating-point nan ieee-754

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

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

很抱歉,如果这个问题很简单,我在互联网上找不到任何解释。

3 个答案:

答案 0 :(得分:24)

IEEE-754标准将NaN定义为指数中所有1的数字,以及非零有效数。有效数字中的最高位指定NaN是信令还是安静信号。有效数字的其余位形成NaN的有效负载

每当操作的一个操作数是NaN时,结果就是NaN,结果的有效负载等于其中一个NaN操作数的有效负载。有效负载保留对efficiency in scientific computing很重要,而at least one company已建议将NaN有效负载用于专有用途。

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

答案 1 :(得分:1)

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

我不会太担心在二进制操作之后传播哪个NaN有效负载。 NaNs是以低概率发生的特殊值,并且获得其中2个的可能性不太可能。

答案 2 :(得分:1)

根据this series of notes by William Kahan(IEEE-754格式的一位设计者)的观点,使用多个NaN的目的是让硬件首先填充有关触发NaN的信息,以便结束计算导致NaN可能运行完毕,然后允许程序员编写代码来分析出了什么问题:

  

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

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