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

时间:2018-01-04 09:30:39

标签: floating-point language-agnostic nan ieee-754 numerical-computing

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

值得一提的是,如果x / 0.0,则infinity将在IEEE-754中为x != 0.0

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

2 个答案:

答案 0 :(得分:4)

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

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

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

级别3是浮点数据的表示。在此级别,有限数字用符号,指数和有效数字表示,它包括-∞和+∞以及两个NaN,一个安静(非信令)NaN和一个信令NaN。 (信令NaN在使用时会导致异常。)有效数是表示的一小部分。如果二进制浮点数的指数为 e 且有效数为 f ,则表示值为 f •2 e 或+ f •2 e ,具体取决于其符号。在这个级别,将两个除以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,我省略了一些细节,例如什么是次正规数,如何对第4级规范化有效数,以及如果未存储有效数的前导位如何被知道。)< / p>

答案 1 :(得分:2)

  

NaN不是定义明确的值,而是一组值

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

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

  

是否有明确定义的位模式

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