我最近刚遇到原始类型包装类中的常量,如Double.POSITIVE_INFINITY
和Double.NEGATIVE_INFINITY
。在API中,它将第一个定义为:
持有double类型的正无穷大的常量。它等于Double.longBitsToDouble(0x7ff0000000000000L)返回的值。
其他人也有这些相同的定义。
我遇到的问题是理解这些常量实际上是什么。它们实际上不能 或代表正/负无穷大,因为系统本质上是有限的。它是Java创建者认为会定义无限概念的一些任意位设置吗?或者这些确实具有某种特殊价值?如果 只是一个被解释为double
的任意位数字符串,则那里有一些正常数字,当被解释为double
时将返回{{1}而不是实际预期的任何值?
如果API的POSITIVE_INFINITY
部分得到了明确答案,请原谅我。说实话,这个描述对我来说非常神秘,我不会假装理解十六进制值实际意味着什么或代表什么。
答案 0 :(得分:20)
Java浮点基于IEEE 754二进制浮点标准Floating Point Standard,其第一个版本是在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轴平行的线,以具有可用于计算的可存储梯度。
答案 1 :(得分:6)
他们确实代表正无穷大,这是IEEE floating point standard中明确定义的概念。例如,将正浮点数除以零会产生正无穷大。至于位模式本身,它只是一个被选择来表示无穷大的模式。
答案 2 :(得分:5)
IEEE Standard 754 Floating Point Numbers州:
“值+无穷大和无穷大用所有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