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

Ken*_*ell 74 java floating-point zero

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

ars*_*jii 87

-0(通常)被视为0*******.当浮点数接近于零以至于可以考虑时可能会导致0(很明显,我指的是算术下溢,并且以下计算的结果被解释为完全 ±0,不仅仅是非常小)号).例如

System.out.println(-1 / Float.POSITIVE_INFINITY);
Run Code Online (Sandbox Code Playgroud)
-0.0

如果我们考虑具有数的相同案例,我们将收到我们的好旧0:

System.out.println(1 / Float.POSITIVE_INFINITY);
Run Code Online (Sandbox Code Playgroud)
0.0

*******这是一个使用-0.0与使用时不同的结果的情况0.0:

System.out.println(1 / 0.0);
System.out.println(1 / -0.0);
Run Code Online (Sandbox Code Playgroud)
Infinity
-Infinity

如果我们考虑这个功能,这是有道理的1 / x.由于x接近0+侧的,我们应该得到积极的无穷大,但因为它从靠近-侧的,我们应该得到无穷大.函数图应该清楚:

(来源)

在数学术语中:

在此输入图像描述

在此输入图像描述

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


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

  • 在这种情况下,每个数字应该有两个"签名"版本,因此`1 /(x - a)`在`a`的任一侧为'x`正确计算. (3认同)

dre*_*ash 29

来自维基百科

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

这发生在整数的符号和幅度以及1的补码有符号数表示中,并且在大多数浮点数表示中.数字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 produces -Infinity while 1/0.0 produces Infinity.

2) 3 * (+0) = +0 and +0/-3 = -0. The sign rules is apply, when performing multiplications or division over a signed zero.

Mandatory reading "What Every Computer Scientist Should Know About Floating-Point Arithmetic" (suggest in the comments).

  • 元讨论[移到这里](http://meta.stackexchange.com/questions/156648/quoting-some-one-is-bad). (3认同)

Pat*_*han 25

请参阅" 每个计算机科学家应该知道的关于浮点算术的内容中的签名零"部分

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


Ste*_*non 8

关于浮点中带符号零的有用性的规范性参考是Kahan的论文" 复杂基本函数的分支削减,或者关于无符号位的很多东西 "(以及他关于这个主题的一些讨论).

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

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