为什么浮点数有符号零?

2022-01-09 00:00:00 floating-point zero java

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

解决方案

-0 (通常)被视为 0 *******.当 negative 浮点数非常接近于零以至于它可以被认为是 0 时,它可能会导致(要清楚,我指的是 )

用数学术语:

这说明了 0-0 在计算意义上的一个显着区别.

<小时>

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

  • 关于签名零的维基百科文章
  • "每个计算机科学家都应该知道的浮点运算知识"(参见有符号零部分)
  • (PDF) "Much Ado About Nothing's Sign Bit" - 一篇有趣的论文由 W. Kahan 撰写.

Why do doubles have -0 as well as +0? What is the background and significance?

解决方案

-0 is (generally) treated as 0 *******. It can result when a negative floating-point number is so close to zero that it can be considered 0 (to be clear, I'm referring to arithmetic underflow, and the results of the following computations are interpreted as being exactly ±0, not just really small numbers). e.g.

System.out.println(-1 / Float.POSITIVE_INFINITY);

-0.0

If we consider the same case with a positive number, we will receive our good old 0:

System.out.println(1 / Float.POSITIVE_INFINITY);

0.0


******* Here's a case where using -0.0 results in something different than when using 0.0:

System.out.println(1 / 0.0);
System.out.println(1 / -0.0);

Infinity
-Infinity

This makes sense if we consider the function 1 / x. As x approaches 0 from the +-side, we should get positive infinity, but as it approaches from the --side, we should get negative infinity. The graph of the function should make this clear:

(source)

In math-terms:

This illustrates one significant difference between 0 and -0 in the computational sense.


Here are some relevant resources, some of which have been brought up already. I've included them for the sake of completeness:

  • Wikipedia article on signed zero
  • "What Every Computer Scientist Should Know About Floating-Point Arithmetic" (See Signed Zero section)
  • (PDF) "Much Ado About Nothing's Sign Bit" - an interesting paper by W. Kahan.

相关文章