关于浮点: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.0x / 0.0将在IEEE-754中infinity

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


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

1级是扩展的实数 - 实数加上?∞和+∞。这是常规数学的水平;两分三分正好是三分之二。

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

级别3是浮点数据的表示。在这个级别,有限数字用符号,指数和有效数表示,它包括∞和+∞和两个NaN,一个安静(非信令)NaN和一个信令NaN。 (信令NaN在使用时会导致异常。)有效数是表示的一小部分。如果二进制浮点数的指数为e且有效数为f,则表示值为?f? 2e还是+ f? 2e,取决于它的标志。在此级别,将2除以3的结果是+符号,指数为-1,有效数为1.3333333333333332593184650249895639717578887939453125,或者以十六进制表示,1.5555555555555 16

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

  • 对于有限数,符号为0(对于+)或1(对于?)。对于正常数字,通过向实际指数添加偏差,将指数编码为无符号值。对于基本的64位二进制格式,偏差是1023,因此实际指数α1被编码为?1 + 1023 = 1022.有效数据被编码,其第一位被移除。因此,对于53位有效数,只有52位存储在有效位字段中。对于次正规数,指数编码为0。

  • Infinity用符号位编码,指数字段全部为1(基本64位二进制格式为2047),有效字段全为零。

  • NaN用符号位,全部为1的指数字段和不全为零的有效字段编码。 IEEE 754-2008建议在有效数字字段的第一位使用1编码静默NaN,并在第一位使用0编码信令NaN,但这不是必需的。

由于"NaN"不是数字,IEEE 754-2008避免将其称为数字或值。第2级的东西是基准。

NaNs是定义良好的数据。指定生成它们的操作和对它们的操作。

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

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


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

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

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

does it have a well-defined bit pattern or not

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