Java中的INFINITY常量是什么?

ast*_*eri 33 java bits constants infinity

我刚刚遇到了原始类型包装类中的常量,如Double.POSITIVE_INFINITYDouble.NEGATIVE_INFINITY.在API中,它将第一个定义为:

持有double类型的正无穷大的常量.它等于Double.longBitsToDouble(0x7ff0000000000000L)返回的值.

其他人也有这些相同的定义.

我遇到的问题是了解这些常数究竟是什么.它们实际上不能代表正/负无穷大,因为系统本质上是有限的.它是Java创建者认为会定义无限概念的一些任意位设置吗?或者这些确实具有某种特殊价值?如果它只是一个解释为a的任意字符串double,那么是否有一些正常的数字,当被解释为double将返回POSITIVE_INFINITY而不是实际预期的任何值?

请原谅我,如果Double.longBitsToDouble(0x7ff0000000000000L)API 的部分答案是明显的.说实话,这个描述对我来说非常神秘,我不会假装理解十六进制值实际上意味着什么或代表什么.

Pat*_*han 20

Java浮点基于IEEE 754二进制浮点标准浮点标准,其第一个版本是在1985年左右发布的,所以它比Java早得多.鉴于定义Java时广泛的IEEE 754硬件实现,Java创建者别无选择.

每个IEEE 754浮点数具有三个分量,符号位,指数和尾数.大大简化,正常数字的大小是:

 mantissa * (2 ** exponent)
Run Code Online (Sandbox Code Playgroud)

其中"**"代表权力.

前导位是符号位.在双精度数中,接下来的11位是指数.

具有所有指数位的位模式保留用于无穷大和NaN.所有正常数字在指数中至少有一个零位.这两个无穷大由所有指数位开启,所有尾数位为零.前导符号位区分正负无穷大.

The choice of all exponent bits one for the special cases is not arbitrary. It is easier to chop off one of the extremes than to deal with a gap in the middle of a range of numbers, especially for hardware implementations. Taking the all bits off exponent for special cases would have prevented encoding zero with the all bits off pattern, and would have given the largest absolute magnitude values, the infinities, the smallest exponent, which would have also made hardware more complicated. The all bits on exponent is definitely the best choice for the infinities.

这两个无穷大都用于表示两件事,实际上是无限结果和结果,绝对量级太大而无法在正常数字系统中表示,数字大于Double.MAX_VALUE或小于-Double.MAX_VALUE.1.0/0.0是无限的.那么是2*Double.MAX_VALUE.

在某种意义上,通过允许中间结果是无限的,有一些算法可以简化,具有更少的特殊情况.这样做还允许例如甚至与y轴平行的线具有可用于计算的可存储梯度.


Aas*_*set 6

它们确实代表正负无穷大,这是IEEE浮点标准中明确定义的概念.例如,将正浮点数除以零会产生正无穷大.至于位模式本身,它只是一个被选择来表示无穷大的模式.

  • @PicklishDoorknob:我想,由于根据解释位的"主要"规则,通常会将许多位模式解释为0,因此他们认为可以将其中一些用于其他目的.我认为位模式没有任何其他意义,但我没有任何参考. (2认同)

the*_*dor 5

IEEE 754标准浮点数规定:

"值+无穷大和无穷大用所有1的指数和所有0的一小部分表示.符号位区分负无穷大和正无穷大.能够将无穷大表示为特定值是有用的,因为它允许操作继续过去的溢出情况.无限值的操作在IEEE浮点中得到很好的定义."

另外: "特殊号码的操作由IEEE定义.在最简单的情况下,任何使用NaN的操作都会产生NaN结果.其他操作如下: "

      Operation         Result
        n ÷ ±Infinity   0
±Infinity × ±Infinity   ±Infinity
±nonzero  ÷ 0           ±Infinity
Infinity  + Infinity    Infinity
       ±0 ÷ ±0          NaN
 Infinity - Infinity    NaN
±Infinity ÷ ±Infinity   NaN
±Infinity × 0           NaN
Run Code Online (Sandbox Code Playgroud)

  • 还有‘n + ±无穷大 = ±无穷大’? (2认同)
  • @caub是的(除非n是与另一个加数相反的无穷大,在这种情况下结果将为NaN)。 (2认同)