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

lev*_*tov 40 floating-point nan ieee-754

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

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

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

Rob*_*vey 25

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

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

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

  • "IEEE-754标准将NaN定义为指数中所有1的数字,并且非零有效数字......无论如何必须保留整个32位"将这个答案归结为"它是如此,因为它是如此",颜色(但话说回来,这是"为什么......?"的问题).它可以被定义为`0x1.fffff0p128`而不是'MAX_FLOAT`被定义为`0x1.fffff0p128`,而最后几个位模式只用于`inf`和`NaN`,而不是整个指数价值被牺牲给他们. (17认同)
  • 关于为什么没有选择其他表示的推测可能包括硬件实现的简单性,以及关于浮点行为的严格数学证明需要足够特殊情况的事实,即使在整个binades中可获得可表示的正常值.有效负载的事情看起来确实是事后的想法,特别是因为当二进制操作应用于两个NaN时,标准甚至没有指定两个有效负载中的哪一个最终结果(对称选择本来是指定按位或者例如,两个有效载荷). (7认同)
  • 应该注意的一点是"保留NaN有效载荷"是标准的"应该"而不是"应该"的规定.第6.2节的部分内容是:"为了便于传播NaN中包含的诊断信息,尽可能多的信息应保存在NaN运行结果中". (4认同)

tem*_*def 8

根据IEEE-754格式的设计者William Kahan的系列说明,使用多个NaN旨在让硬件首先填充有关触发NaN的信息,以便最终进行计算导致NaN可能运行完毕,然后允许程序员编写代码来分析出了什么问题:

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

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

  • 在大型机时代,您将作业作为一叠打孔卡提交,然后去拿结果的打印输出,这在大型机时代尤其合理。对于大多数用例,交互式调试显着降低了这一点。 (3认同)