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

问题描述 投票:33回答:3

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

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

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

floating-point nan ieee-754
3个回答
24
投票

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

每当操作的一个操作数是NaN时,结果是NaN,并且结果的有效载荷等于NaN操作数之一的有效载荷。有效载荷保存对于efficiency in scientific computing很重要,而at least one company已经建议将NaN有效载荷用于专有用途。

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


1
投票

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

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


1
投票

根据IEEE-754格式的设计者之一this series of notes by William Kahan的说法,多个NaN的使用旨在让硬件首先填写有关触发NaN的信息,以便最终导致NaN的计算可以运行到完成然后允许程序员编写代码来分析出错的地方:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.