java - Java 中的 INFINITY 常量到底是什么?

标签 java constants bit infinity

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

A constant holding the positive infinity of type double. It is equal to the value returned by Double.longBitsToDouble(0x7ff0000000000000L).

其他人也有类似的定义。

我遇到的问题是理解这些常量实际上是什么。它们实际上不能成为表示正/负无穷大,因为系统本质上是有限的。 Java创建者认为它只是定义无限概念的任意位设置吗?还是这些实际上有某种特殊值(value)?如果它只是解释为 double 的任意位字符串,那么当解释为 double 时是否有一些正常的数字将返回 POSITIVE_INFINITY 而不是实际预期的任何值?

鉴于 API 的 Double.longBitsToDouble(0x7ff0000000000000L) 部分,如果这个问题的答案很明显,请原谅我。老实说,这种描述对我来说非常神秘,我不会假装理解十六进制值的实际含义或代表什么。

最佳答案

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

每个 IEEE 754 float 都包含三个部分:符号位、指数和尾数。大大简化,正态数的大小为:

 mantissa * (2 ** exponent)

其中“**”代表权力。

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

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

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

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

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

关于java - Java 中的 INFINITY 常量到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13317566/

相关文章:

java - jvm:是否有可能在关闭 Hook 中发现进程由于 OOM 而关闭?

C++ 允许重新定义全局(const)变量吗?

c++ - 我有非常量 ID3D11ShaderResourceView*,并且 DirectX 函数需要 const 一个

c++ - 静态变量和常量变量有什么区别?

mysql - 使用位域进行调度?

c# - 如何用 SqlDataReader 获取位值并将其转换为 boolean 值?

java - 以一致的速度将物体从 A 点移动到 B 点

java - 无法通过使用java执行shell脚本来创建文件夹

java - apache Tomcat 中的奇怪输出?

c - C:位字段和按位运算符