为什么浮点数已经签名为零?

时间:2012-11-24 18:42:07

标签: java floating-point zero

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

4 个答案:

答案 0 :(得分:87)

-0(通常)被视为0 *******。当浮点数接近于零时,可以将其视为0(很明显,我指的是arithmetic underflow,并且以下计算的结果被解释为完全 ±0,而不仅仅是非常小的数字)。 e.g。

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);
Infinity
-Infinity

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

source

在数学术语中:

enter image description here

enter image description here

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


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

答案 1 :(得分:29)

来自维基百科

  

带符号的零为零,带有相关符号。在普通的算术中,   −0 = +0 = 0。在计算中,表现出存在的概念   一些数字表示中的两个零,通常用−0表示   和'+0',代表负零+0 正零,   分别(source)。

     

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

     

根据IEEE 754 standard,负零和正零   比较等于与通常(数字)比较   运算符,如C和Java的==运算符。 (source)。

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

这种区分在-0.0+0.0中,为您提供的信息不仅仅是为您提供最终结果0.当然,这个概念“仅”存在于有限的表示系统中,如在电脑中使用。在数学中,你可以表示任何数字,即使它非常接近于零。

−0+0是导致 underflows 的操作的结果,类似−00+00来自于导致 overflow 。对于导致数学不确定的操作,结果为 NaN (例如0/0)。

-0.0和0.0之间有什么区别?

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

1)1/-0.0产生 -Infinity ,而1/0.0产生无限

2)3 * (+0) = +0 +0/-3 = -0 。当对有符号零进行乘法或除法时,符号规则适用。

强制性阅读“What Every Computer Scientist Should Know About Floating-Point Arithmetic”(在评论中提出)。

答案 2 :(得分:25)

请参阅What Every Computer Scientist Should Know About Floating-Point Arithmetic

中的“签名零”部分

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

答案 3 :(得分:8)

关于浮点中带符号零的有用性的规范性参考是Kahan的论文“Branch Cuts for Complex Elementary Functions, or Much Ado About Nothing's Sign Bit”(以及他关于这个主题的一些讨论)。

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

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