什么是Java中的INFINITY常数,真的吗?(What are the INFINITY constants in Java, really?)

最近,我对面的常量的基本类型的包装类,如跑Double.POSITIVE_INFINITYDouble.NEGATIVE_INFINITY 。 在API中,它定义了第一个为:

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

其他人沿着这些相同的线定义。

什么我在与被了解什么这些常量实际上是麻烦。 他们实际上不能代表正/负无穷大,因为系统本质上是有限的。 它是在Java的创造者认为将定义无穷大的概念位的只是一些随意设置? 或者说,这些实际上有某种特殊的价值? 如果位任意的字符串解释为一个double ,那么有没有一些正常的数量在那里,当解释为double会返回POSITIVE_INFINITY ,而不是任何实际价值预计?

原谅我,如果这个问题的答案是显而易见给出的Double.longBitsToDouble(0x7ff0000000000000L) API的一部分。 说实话,这样的描述是相当神秘的给我,我不会假装明白的十六进制值的实际含义或代表。

Answer 1:

Java的浮点是基于IEEE 754二进制浮点标准浮点标准 ,它的第一个版本在1985年左右被发布,所以它比Java更老。 通过正在定义的Java时考虑IEEE 754的广泛的硬件实现,Java的创造者别无选择。

每个IEEE 754浮点数有三个组成部分,一个符号位,指数和尾数。 大大简化,一个正常数的大小是:

 mantissa * (2 ** exponent)

其中,“**”代表权力。

前导位为符号位。 在双打中,接下来的11位是指数。

与所有的指数位的位模式保留无穷大和NaN。 所有正常的数字有在指数至少一个零位。 两个无穷被具有上所有指数位表示,并且所有尾数位为零。 领先的符号位区分正和负无穷大。

所有指数的选择位一个特殊情况是不是任意的。 这是比较容易砍掉的极限,而不是应对数字范围的中间的缝隙之一,尤其是对硬件实现。 以在所有位关闭指数在特殊情况下会阻止编码为零的所有位关模式,并且愿意付出的最大绝对幅度值,在无穷大,最小的指数,这也使得硬件更加复杂。 对指数的所有位,绝对是为无穷大的最佳选择。

这两个无穷大都是用来表示两件事情,实际上是无限的结果,并且是绝对幅度太大,无法在正常的数字系统来表示结果,数字比Double.MAX_VALUE比-Double.MAX_VALUE更大或更小。 1.0 / 0.0是无限的。 所以是2 * Double.MAX_VALUE。

有一些算法可以简化,具有更少的特殊情况下,通过允许中间结果是无限的,在任一意义。 这样做也允许例如即使是平行线到y轴具有可在计算中使用可存储的梯度。



Answer 2:

他们确实代表正和负无穷大,这是明确的定义的概念IEEE浮点标准 。 例如,将一个正的浮点数由零产生正无穷大。 作为位模式本身,它只是已经选择表示无穷大的图案。



Answer 3:

IEEE 754标准浮点数规定:

“的值+无穷大,并且-infinity标注全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