Floating point 为什么IEEE 754保留了这么多NaN值?

Floating point 为什么IEEE 754保留了这么多NaN值?,floating-point,nan,ieee-754,Floating Point,Nan,Ieee 754,IEEE 754标准似乎将16777214 32位浮点值定义为NAN,或所有可能值的0.4% 我想知道保留这么多有用值的理由是什么,而实际上只需要两个值:一个用于信令,一个用于安静NaN 很抱歉,如果这个问题很琐碎,我在互联网上找不到任何解释。IEEE-754标准将NaN定义为指数中包含所有1的数字和非零有效位。有效位中的最高阶位指定NaN是信令还是静默。有效位的剩余位形成被称为NaN的有效载荷 每当操作的一个操作数是NaN时,结果就是NaN,结果的有效负载等于其中一个NaN操作数的有效负载。有

IEEE 754标准似乎将16777214 32位浮点值定义为NAN,或所有可能值的0.4%

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


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

IEEE-754标准将NaN定义为指数中包含所有1的数字和非零有效位。有效位中的最高阶位指定NaN是信令还是静默。有效位的剩余位形成被称为NaN的有效载荷

每当操作的一个操作数是NaN时,结果就是NaN,结果的有效负载等于其中一个NaN操作数的有效负载。有效载荷保留对于维护非常重要,并已建议将NaN有效载荷用于专有用途


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

同样,64位浮点数也有有效负载,可能值约为10^15。不幸的是,对于有效负载应该如何在32位和64位浮点数之间传输,以及如何在32位和64位浮点数之间传输,即是否保留最高有效位或最低有效位,实现存在分歧。由于有效负载处理是特定于机器的,所以需要不同的代码来处理不同机器上的有效负载

我不会太担心在二进制操作之后传播哪个NaN负载。NAN是发生概率很低的异常值,不太可能得到其中的两个。

根据IEEE-754格式的一位设计者,使用多个NaN的目的是让硬件填写关于首先触发NaN的信息,以便最终导致NaN的计算可以运行到完成,然后允许程序员编写代码来分析出错的原因:

IEEE 754对NaN的规范赋予了它一个位域,软件可以在其中记录NaN的形成方式和/或位置。这些信息对于后续故障计算的“回顾性诊断”非常有帮助,但现在还没有软件可以使用它。通常,该字段已从一个操作数NaN复制到每个算术运算的结果NaN,或者在由一个未加限制的无效操作创建新NaN时,用二进制1000…000填充。由于缺乏利用它的软件,这种习惯已经萎缩


因此,这似乎是有意为之的,没有具体说明,因此不同的系统可以以不同的方式处理事情。回想起来,这似乎从未真正发生过,但这似乎是一个合理的想法

1)据我所知,建议提供利用NaN playload的工具,这似乎是为了减少价值浪费带来的伤害,但这本身并不是IEEE-754标准制定时牢记的有意义的东西。该标准故意含糊不清,仅将这些位描述为有效载荷。最后一段只是说,如果你不使用这些位,它们就不用了。这些部分必须存在;IEEE-754标准将NaN定义为一个指数中包含所有1的数字,以及一个非零的有效位……无论如何,整个32位都必须保留“这是如此,因为它是如此”,颜色(但这又是一个“为什么…?”问题)污染了这个答案。与其将
MAX_FLOAT
定义为
0x1.fffff ep127
,不如将其定义为
0x1.fffff 0p128
,最后一对位模式仅用于
inf
NaN
,而不是牺牲整个指数值。关于为什么不选择其他表示形式的推测可能包括硬件实现的简单性,事实上,关于浮点行为的严格数学证明已经需要足够多的特殊情况,即使在整个二进制代码中都有可表示的正常值。有效负载的事情看起来真的是事后诸葛亮,特别是因为标准甚至没有指定当二进制操作应用于两个NAN时,两个有效负载中的哪一个最终会出现在结果中(例如,对称选择是指定两个有效负载的按位or)“NaN有效载荷的保存”是本标准的“应”而非“应”规定。第6.2节的部分内容为:“为了促进NaN中包含的诊断信息的传播,应在NaN操作结果中尽可能多地保存这些信息“。请注意,NaN值所代表的可能值的百分比会随着格式大小的增加而降低,因为在较大的IEEE 754二进制格式中,分配给指数的位数会按比例降低。@Pacier:问题是正确的;二进制代码32中有2^24-2个NAN。(缺少的两个是正无穷大和负无穷大。)因此,动态语言实现者可以将该空间用于其所有其他非浮点对象。在大型机时代尤其合理,在大型机时代,您将作业作为一堆穿孔卡提交,然后去获取结果的打印输出。对于大多数用例,交互式调试会显著降低这一价值。然而,计算机是确定性的,而不是概率性的。因此,如果一个国家注定要发生,它将发生。