gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:58:40 26 4
gpt4 key购买 nike

我最近刚刚遇到了原始类型包装类中的常量,例如 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com