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

pla*_*cel -1 language-agnostic floating-point nan numerical-computing ieee-754

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

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

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

Eri*_*hil 5

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

\n\n

第 1 级是扩展实数 \xe2\x80\x94,即实数加上 \xe2\x88\x92\xe2\x88\x9e 和 +\xe2\x88\x9e。这是常规数学的水平;二除以三正好是三分之二。

\n\n

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

\n\n

第 3 级是浮点数据的表示。在这个级别,有限数用符号、指数和尾数表示,它包括 \xe2\x88\x92\xe2\x88\x9e 和 +\xe2\x88\x9e 和两个 NaN,一个安静(非-signaling) NaN 和一个signaling NaN。(使用信号 NaN 会导致异常。)尾数是表示形式的小数部分。如果二进制浮点数的指数为e,尾数为f,则它表示值 \xe2\x88\x92 f \xe2\x80\xa2 2 e或 + f \xe2\x80\xa2 2 e,取决于它的标志。在此级别,二除以三的结果是 + 号,指数为 -1,有效数为 1.3333333333333332593184650249895639717578887939453125 或十六进制的 1.5555555555555 16

\n\n

第 4 级是位串。在这个级别:

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

  • \n
  • 无穷大用符号位、全为 1 的指数字段(基本 64 位二进制格式为 2047)和全为 0 的尾数字段进行编码。

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

  • \n
\n\n

由于 \xe2\x80\x9cNaN\xe2\x80\x9d 不是数字,IEEE 754-2008 避免将其称为数字或值。2 级中的事物是数据。

\n\n

NaN 是定义明确的数据。生成它们的操作以及对它们的操作是指定的。

\n\n

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

\n\n

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

\n