Java中的无穷大常量到底是什么?

2022-09-01 06:12:47

我最近在基元类型包装器类中遇到了常量,如 和 。在 API 中,它将第一个定义为:Double.POSITIVE_INFINITYDouble.NEGATIVE_INFINITY

保持双精度型的正无穷大的常数。它等于 Double.longBitsToDouble(0x7ff0000000000000L) 返回的值。

其他人也有类似的定义。

我遇到麻烦的是理解这些常量到底是什么。它们实际上不能表示正/负无穷大,因为系统本质上是有限的。它只是Java创建者认为可以定义无穷大概念的一些任意设置位吗?还是这些实际上具有某种特殊价值?如果它只是一个任意的位字符串,解释为 a ,那么当被解释为 a 时,是否存在一些正常的数字,而不是实际预期的任何值?doubledoublePOSITIVE_INFINITY

如果考虑到API的部分,这个问题的答案是显而易见的,请原谅我。说实话,这种描述对我来说非常晦涩难懂,我不会假装理解十六进制值的实际含义或表示。Double.longBitsToDouble(0x7ff0000000000000L)


答案 1

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

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

 mantissa * (2 ** exponent)

其中“**”表示权力。

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

所有指数位都处于打开状态的位模式是为无穷大和 NaN 保留的。所有正常数在指数中至少有一个零位。这两个无穷大表示为所有指数位,并且所有尾数位都为零。前导符号位区分正无穷大和负无穷大。

对于特殊情况,所有指数位 1 的选择不是任意的。砍掉其中一个极端比处理一系列数字中间的差距更容易,特别是对于硬件实现。对于特殊情况,将所有位从指数中取出将阻止使用所有位关闭模式进行零编码,并且会给出最大的绝对星等值,无穷大,最小的指数,这也会使硬件更加复杂。指数上的所有位绝对是无穷大的最佳选择。

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

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


答案 2

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


推荐