双打为什么非得-0
以及+0
?背景和意义是什么?
Answers:
-0
(通常)被视为0
*******。当负浮点数非常接近零以至于可以考虑时,可能会导致这种情况0
(很明显,我指的是算术下溢,并且以下计算的结果被解释为完全是 ±0
,而不仅仅是很小数字)。例如
System.out.println(-1 / Float.POSITIVE_INFINITY);
-0.0
如果我们以正数来考虑相同的情况,我们将收到很好的旧信息0
:
System.out.println(1 / Float.POSITIVE_INFINITY);
0.0
*******在这种情况下,使用-0.0
结果与使用时会有所不同0.0
:
System.out.println(1 / 0.0);
System.out.println(1 / -0.0);
无限 -无限
如果考虑功能,这是有道理的1 / x
。由于x
接近0
从+
侧的,我们应该得到积极的无穷大,但因为它从靠近-
侧的,我们应该得到负无穷大。该函数的图形应使这一点变得清楚:
(来源)
在数学术语中:
这说明之间的一个显著的差异0
,并-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的论文“复杂基本功能的分支割,或关于Nothing的符号位无所适从”(以及他在该主题上的一些演讲)。
简短的版本是在合理的通用工程应用中,必须通过对零进行签名来保留符号信息,以便从数值方法中获得正确的解。零符号对大多数实际操作几乎没有意义,但是当考虑复数值函数或使用保形映射时,零符号可能突然变得非常关键。
还值得注意的是,最初的(1985)IEEE-754
委员会考虑并拒绝支持浮点运算的投影模式,在该模式下,将只有一个无符号无穷大(在这种模式下,+ /-0在语义上是相同的,因此,即使仍然有两种编码,也只会有一个零。