为什么双打有-0
以及+0
?有什么背景和意义?
4 回答
-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
。
以下是一些相关资源,其中一些已经提出。为了完整起见,我将它们包括在内:
- 关于签名零的维基百科文章
- “每个计算机科学家都应该知道的关于浮点运算的知识”(参见有符号零部分)
- (PDF) “Much Ado About Nothing's Sign Bit” ——W. Kahan 的一篇有趣的论文。
来自维基百科
带符号的零是带有关联符号的零。在普通算术中,
−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/-0.0
产生-Infinity而1/0.0
产生Infinity。3 * (+0)
= +0和+0/-3
= -0。符号规则适用于对有符号零执行乘法或除法。
请参阅每个计算机科学家应该了解的浮点运算中的“有符号零”部分
Java float 和 double 中的零不仅代表真正的零。它们也被用作任何计算的结果,其精确结果的幅度太小而无法表示。在许多情况下,负数下溢和正数下溢之间存在很大差异。例如,如果x
是一个非常小的量级正数,1/x
应该是正无穷大,1/(-x)
应该是负无穷大。有符号零保留下溢结果的符号。
浮点中带符号零的用处的规范参考是 Kahan 的论文“复杂基本函数的分支切割,或无事生非的符号位”(以及他关于该主题的一些演讲)。
简短的版本是,在相当常见的工程应用中,通过零符号保留的符号信息对于从数值方法中获得正确的解决方案是必要的。零的符号对于大多数实际运算几乎没有意义,但是当考虑复值函数或使用保形映射时,零的符号可能会突然变得非常关键。
还值得注意的是,最初的(1985 年)IEEE-754
委员会考虑并拒绝了支持浮点运算的投影模式,在这种模式下,只有一个无符号无穷大(在这种模式下,+/-0 在语义上是相同的,所以即使仍然有两个编码,也只有一个零)。