为什么浮点数带有零符号?


Answers:


87

-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在计算感。


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


29

来自维基百科

有符号的零为零,带有相关的符号。在普通算术中, −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。当对有符号零执行乘法或除法运算时,将应用符号规则

强制性阅读“每位计算机科学家应了解的浮点运算法则”。


25

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

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


8

关于浮点中有符号零的有用性的规范参考是Kahan的论文“复杂基本功能的分支割,或关于Nothing的符号位无所适从”(以及他在该主题上的一些演讲)。

简短的版本是在合理的通用工程应用中,必须通过对零进行签名来保留符号信息,以便从数值方法中获得正确的解。零符号对大多数实际操作几乎没有意义,但是当考虑复数值函数或使用保形映射时,零符号可能突然变得非常关键。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.