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值? 换句话说,它是否具有明确定义的位模式?
-
只是为了迂腐:对于所有x,x / 0.0在数学上是未定义的:它没有任何不确定性(除数仅在除数为非零时定义)。
-
@Richard不正确。如果x != infinity且x != 0,则x / 0.0为infinity。
-
不,不是(除非您对特定字段的实数使用特定扩展):检查实数字段的公理定义。
-
@Richard我很糟糕,我把你的评论解释为IEEE-754数学。另一方面,不确定和未定义只是对同一事物的不同措辞。 Wolfram Mathematica使用单词indeterminate作为例子。
-
@牛米。这根本不是故事的结局。如果您通过汇编或Intel ISA扩展(如SSE,AVX)操作浮点数,那么您不受类型系统的限制,您可以轻松地将浮点值解释为位域(并且您必须在某些位置)情况,即浮点绝对值实际上是一个AND,所以它绝对重要。
-
即使x是无穷大,x / 0.0也是无穷大。
-
@PascalCuoq你是对的,纠正了。
-
在这种情况下,为什么要知道NaN的特定编码? (重新阅读时,这似乎可能是一个XY问题。)任何支持IEEE-754的平台都需要有一个IsNaN函数来确定某个值是否为NaN:为什么你不能使用它?
-
@Richard因为不是我想知道的。
-
对不起,最后一条评论没有解析。
-
@Richard:为了适当迂腐,数学家使用许多不同的数字/算术/符号/逻辑系统。没有绝对意义上的* x * / 0.0是或未定义的;是否定义为非零取决于您使用的是哪个系统。这些系统有各种各样的有用理由,因为它们很好地模拟了明显现实的各个方面,但它们都不是完美的,并且它们都没有对真理的绝对主张。当问题清楚地询问关于IEEE 754算法(确实定义它)时,关于* x * / 0未被定义的迂腐主张是没有用的。
-
@EricPostpischil 1.我的第二条评论引用了这就是为什么我也说"实际领域"(不受"扩展数字线"变化的影响)。 2.请重新阅读问题的开头。
-
@EricPostpischil虽然我完全赞同你,但如果我们应该非常迂腐(我们不应该),那么值得一提的是,实际上x/0被定义为复数无穷大,这在实数集上是未定义的。 :]
-
@Richard:没有帮助。
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 sub>。
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不要求任何特定的位模式。
-
你在跟我开玩笑吗?"这是一个值(实际上是两个值,安静的NaN和信号NaN),它们具有多个表示。" - 从问题中可以清楚地看出,按值我的意思是它的二进制整数表示。 并且对于安静和信令NaN有不同的表示。 在IEEE-754中,NaN被定义为填充有1的指数字段。 尾数可以是非零的。
-
@plasmacel"值"的意思不一定是IEEE标准的含义。 我已经改变了答案,更多地遵循IEEE术语。