当前位置: 首页 > 面试题库 >

实际上,Java中的INFINITY常量是什么?

淳于涛
2023-03-14
问题内容

最近,我遇到了原始类型包装器类(如Double.POSITIVE_INFINITY和)中的常量Double.NEGATIVE_INFINITY。在API中,第一个定义为:

一个常数,保持double型的正无穷大。它等于Double.longBitsToDouble(0x7ff0000000000000L)返回的值。

其他人也有同样的定义。

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

给定Double.longBitsToDouble(0x7ff0000000000000L)API
的一部分,如果答案很明显,请原谅我。说实话,这种描述对我来说是很神秘的,我不会假装理解十六进制值的实际含义或代表。


问题答案:

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轴的线也具有可存储的梯度,该梯度可以在计算中使用。



 类似资料:
  • 问题内容: 在构建RPM软件包的过程中,我必须指定BuildRoot,以后将在%install中使用它来侵害$ RPM_BUILD_ROOT。我一直认为$ RPM_BUILD_ROOT是RPM执行打包的假安装。然后,在使用RPM软件包进行安装时,它将安装到实际位置。例如: 我认为$ RPM_BUILD_ROOT仅用于打包过程,并且在某些方面,当用户执行“ rpm -ivh package.rpm”

  • 我正试图把我的头缠在Apache Mesos上,需要澄清几个项目。 我对Mesos的理解是,它是一个安装在集群中的每个物理/VM服务器(“节点”)上的可执行文件,然后提供一个Java API(不知何故),将每个单独的节点视为计算资源(CPU/RAM/等)的集体池。因此,对于使用Java API编码的程序,他们只看到一组资源,而不必担心如何/在哪里部署代码。 因此,首先,我在这里的理解可能是根本错误

  • 我在看一个典型的for循环: 我对int I=1后的分号很满意:它是一个声明新变量的语句。如果i也是一个语句,为什么后面没有分号? 另一个例子。我打开Jshell并放置以下内容: 换句话说,命令可以工作,与是否有分号无关。我希望没有它就无法工作。 最后一个示例(改编自关于

  • 我已经回答了一个关于Python中的绝对导入的问题,我认为通过阅读Python2.5更改日志和附带的PEP我理解了这个问题。但是,在安装Python2.5并尝试创建一个从__future__import absolute_import中正确使用

  • 问题内容: 在Java中,接口的任何使用都由抽象类实现。我知道接口的一个优点是,如果我们实现一个接口,那么我们也可以扩展另一个类。Java接口还有其他用途或优点吗? 问题答案: 您喜欢什么:在一个Abstract类中成千上万个抽象方法并继承该类,或者为特定的抽象方法创建尽可能多的接口,并通过继承所需的任意数量的接口来仅使用您想要的那些方法… 因此,仅通过继承特定接口使用该方法即可,如果您要继承类,

  • 当我在写这段代码时,我得到了一个编译时错误,它说:“lambdas中的变量必须是final或实际上是final”。