77

为什么双打有-0以及+0?有什么背景和意义?

4

4 回答 4

89

-0(通常)被视为0*******。当浮点数非常接近于零以至于可以考虑时,它可能会导致0(要清楚,我指的是算术下溢,并且以下计算的结果被解释为精确 ±0,而不仅仅是非常小数)。例如

System.out.println(-1 / Float.POSITIVE_INFINITY);
-0.0

如果我们用数考虑相同的情况,我们将收到我们的好旧的0

System.out.println(1 / Float.POSITIVE_INFINITY);
0.0

******* 以下是 using-0.0导致的结果与 using 不同的情况0.0

System.out.println(1 / 0.0);
System.out.println(1 / -0.0);
无穷
-无穷

如果我们考虑函数,这是有道理的1 / x。当从-sidex接近时,我们应该得到无穷大,但是当它从-side 接近时,我们应该得到无穷大。函数图应该清楚地说明这一点:0+-

来源

在数学方面:

在此处输入图像描述

在此处输入图像描述

0这说明了计算意义上的一个显着差异-0


以下是一些相关资源,其中一些已经提出。为了完整起见,我将它们包括在内:

于 2012-11-24T18:46:40.370 回答
31

来自维基百科

带符号的零是带有关联符号的零。在普通算术中, −0 = +0 = 0. 在计算中,存在一些数字表示中存在两个零的概念,通常用 −0 和'+0'表示,分别表示 负零+0 正零来源)。

这发生在整数的符号和幅度以及一个补码的有符号数表示中,以及大多数浮点数表示中。数字 0 通常编码为 +0,但可以用 +0 或 -0 表示。

根据IEEE 754 standard,负零和正零应该与通常的(数字)比较运算符相等,例如 C 和 Java 的 == 运算符。来源)。

当您的浮点运算产生的结果是接近零负浮点数,但不能(由计算机)表示时,它会产生“-0.0”。例如 - 。5.0 / Float.POSITIVE_INFINITY -> -0.0

-0.0和之间的这种区别+0.0为最终用户提供了更多信息,而不仅仅是显示最终结果0。自然,这样的概念实际上在具有有限数值表示限制的系统中有用,例如计算机。在数学中,一个可以表示任何数字,无论它有多接近于零。

−0+0是 由 计算机 执行 的 导致下溢−00的 数学 运算 的 结果,类似于+00导致溢出的 运算 的 结果. 对于导致数学不确定的运算,结果为NaN例如, 0/ 0)。

-0.0 和 0.0 有什么区别?

实际上,两者都代表0. 此外, (-0.0 == 0.0) 返回true。尽管如此:

  1. 1/-0.0产生-Infinity1/0.0产生Infinity

  2. 3 * (+0)= +0+0/-3= -0符号规则适用于对有符号零执行乘法或除法。

必读“每个计算机科学家都应该知道的关于浮点运算的知识”。

于 2012-11-24T18:43:35.963 回答
25

请参阅每个计算机科学家应该了解的浮点运算中的“有符号零”部分

Java float 和 double 中的零不仅代表真正的零。它们也被用作任何计算的结果,其精确结果的幅度太小而无法表示。在许多情况下,负数下溢和正数下溢之间存在很大差异。例如,如果x是一个非常小的量级正数,1/x应该是正无穷大,1/(-x)应该是负无穷大。有符号零保留下溢结果的符号。

于 2012-11-24T18:51:08.423 回答
9

浮点中带符号零的用处的规范参考是 Kahan 的论文“复杂基本函数的分支切割,或无事生非的符号位”(以及他关于该主题的一些演讲)。

简短的版本是,在相当常见的工程应用中,通过零符号保留的符号信息对于从数值方法中获得正确的解决方案是必要的。零的符号对于大多数实际运算几乎没有意义,但是当考虑复值函数或使用保形映射时,零的符号可能会突然变得非常关键。

还值得注意的是,最初的(1985 年)IEEE-754委员会考虑并拒绝了支持浮点运算的投影模式,在这种模式下,只有一个无符号无穷大(在这种模式下,+/-0 在语义上是相同的,所以即使仍然有两个编码,也只有一个零)。

于 2012-11-25T19:22:30.463 回答