非数字(NaN)

时间:2018-11-09 10:00:51

标签: floating-point number-formatting arithmeticexception arithmetic-overflow

为什么在浮点运算中某些数字被定义为非数字(NaN)? (尽管它们可以用IEEE格式表示,并且确实是实数)

2 个答案:

答案 0 :(得分:2)

问题的作者也发表了此评论:

  

我不明白“所有指数位都是1且尾数不是全零”的数字不是实数。

此注释背后的原因似乎是:二进制浮点格式具有符号位 s ,一些指数位 e 和一些有效位 f 。对于大多数 e 值,表示的值为(−1) s •1。 f •2 < sup> e - bias (其中“ 1. f ”是由“ 1.”和“ f bias 位是指数的编码偏差。采用这种方案,所有指数的取值为一个数字,那么它的NaN怎么算?

答案是IEEE-754标准指定了浮点编码的位表示什么,并指出:

  • 如果 e 为零,则表示的值为(−1) s •0。 f • 2 e min ,其中 e min 是该格式的最小指数。 ( e min 等于1- bias 。)
  • 如果 e 不全为零或全为1,则表示的值为(-1) s •1。 •2 e - bias
  • 如果 e 全部为1并且 f 为零,则表示的值为(-1) s •∞。
  • 如果 e 全部为1,并且 f 不为零,则表示的值为NaN。 (有关发信号通知NaN与静默NaN以及使用 f 的位来传达附加信息,有一些与实现相关的细节。)

事实上,存在一个为 e 的值表示的值模式,该值介于(但不包括)全零和全零之间,并不意味着该模式必须扩展到 e 时。 em>是全零或全1。关于逻辑或物理学的任何事情,都没有强迫我们设计将模式扩展到所有 e 值的硬件。如上所述,制定了规则,IEEE-754浮点的实现遵循这些规则。

此外,上述值构成IEEE-754称为浮点数据的集合。该集合包括-∞和+∞,它们是由 s e f 的值引起的各种非零实数,其中两个“零”由符号区分:−0和+0,以及NaN。然后,许多IEEE-754算术运算规范都使用这些值。例如,加法被定义为产生一个结果,就好像计算了精确的数学和,然后对其应用了四舍五入规则。每个舍入规则都指定,如果值超出某些范围,则结果为无穷大。否则,将精确的数学和沿四舍五入规则指定的方向四舍五入到最接近的可表示值(例如,在任一方向上朝+∞,向-∞或朝零方向最近)。

因此,当在硬件或软件中实施IEEE-754时,该实施都将遵循这些规则。当规则说要产生无穷大时,实现将产生代表无穷大的位模式。当输入操作数具有无穷大的位模式时,该实现将其视为无穷大,而不是其代表的实数,如果指数编码的含义扩展了普通数的模式。

答案 1 :(得分:1)

Inf和NaN的特殊情况不会被视为数字,因为根据定义它们是Inf和NaN。该定义在IEEE 754-2008的6.2.1节中(不是免费标准)。

NaN的生成和传播是在硬件中处理的(至少在Intel硬件上,请参见“Intel®64和IA-32体系结构软件开发人员手册”作为示例,尤其是E4.2.2,其中有详细介绍)。 / p>