0.0 / 0.0 是一个明确定义的值吗?

Is 0.0 / 0.0 a well-defined value?

由于 0.0 / 0.0 在数学上 未定义 ,因此 IEEE-754 浮点标准合理地将 NaN 定义为其结果。现在,因为与 infinity 不同,NaN 不是一个明确定义的值,而是一组值,所以 0.0 / 0.0 是否是一个明确定义的常量的问题也是合理的。

值得一提的是,如果 x != 0.0.

x / 0.0 在 IEEE-754 中将是 infinity

0.0 / 0.0 是否是 IEEE-754 浮点标准中明确定义的常量 NaN 值?换句话说,它是否具有明确定义的位模式?

NaN is not a well-defined value, but a set of values

对于 IEEE,值是抽象的数学实体,与其编码分开。例如,一个特定的位模式可以编码一个数值 42.0。位模式不是实数,而是一个编码。

NaN是一个符号实体(不是数字,顾名思义),有两种,静默NaN和信号NaN。 NaN 有不止一种编码作为一种位模式。

does it have a well-defined bit pattern or not

IEEE-754 不强制要求任何特定的位模式。

IEEE 754-2008 描述了指定浮点数据的四个级别。

Level 1是扩展实数——实数加上-∞和+∞。这是普通数学的水平;二除以三正好是三分之二

2级是浮点数据。它包括所有可表示为浮点数(有限和无限)的值加上一个 NaN,并且它区分 −0 和 +0。这是浮点运算的级别; operations return 一个值,它是四舍五入为可表示值的精确数学值。在使用舍入到最近模式的基本 64 位二进制格式中,二除以三正好是 0.66666666666666662965923251249478198587894439697265625。这个级别是代数封闭的;对浮点数据的任何算术运算都会产生浮点数据(可能是 NaN)。

级别 3 是浮点数据的表示。在这个级别,有限数用符号、指数和尾数表示,它包括 −∞ 和 +∞ 以及两个 NaN,一个安静(非信号)NaN 和一个信号 NaN。 (信号 NaN 在使用时会导致异常。)有效数是表示的小数部分。如果一个二进制浮点数的指数为e,尾数为f,它表示的值为-f • 2e 或 +f • 2e,取决于它的符号。在这个级别,二除以三的结果是一个 + 号,指数为 -1,有效数为 1.3333333333333332593184650249895639717578887939453125 或十六进制的 1.555555555555516.[=11]。

4级是比特串。在这个级别:

  • 对于有限数,符号为 0(代表 +)或 1(代表 −)。对于普通数,通过向实际指数添加偏差将指数编码为无符号值。对于基本的 64 位二进制格式,偏差为 1023,因此 −1 的实际指数被编码为 −1+1023 = 1022。有效数在编码时去掉了它的第一位。因此,对于 53 位尾数,只有 52 位存储在尾数字段中。对于次正规数,指数被编码为 0.

  • 无穷大是用一个符号位、一个全为1的指数字段(基本64位二进制格式为2047)和一个全为零的有效数字字段编码的。

  • NaN 使用符号位、全为 1 的指数字段和不全为 0 的尾数字段进行编码。 IEEE 754-2008 建议安静 NaN 在有效数字字段的第一位编码为 1,而信号 NaN 在第一位编码为 0,但这不是必需的。

由于“NaN”不是数字,IEEE 754-2008 避免将其称为数字或值。 level 2 中的事物是数据。

NaN 是定义明确的数据。指定了产生它们的操作和对它们的操作。

从技术上讲,0.0 / 0.0 不是一个常数;这是一个表达。 IEEE 754-2008 指定零除以零表示无效操作异常。当发出异常信号时,正常处理可能会中断,因此该除法可能不会产生任何结果。在许多环境中,浮点异常只是引发一个记录异常的标志,但正常处理仍在继续。在这种情况下,IEEE 754-2008 指定操作产生安静的 NaN。 IEEE 754-2008 没有指定 quiet NaN 中的特定位;系统可以自由使用这些位来编码诊断信息或将它们用于其他目的。

(为了专注于 NaN,我省略了一些细节,例如次正规数是什么,四级如何对有效数进行归一化,以及如果未存储有效数的前导位如何知道。 )