当前位置: 首页 > 知识库问答 >
问题:

如何解释Java中double的范围?

傅鸿波
2023-03-14

我正在学习编程入门课程(java),我很想理解为什么java中原始数据类型的范围是原样的。当涉及到像一个字节这样的类整数数据类型时,似乎很容易理解为什么它只接受从-128到127的值;一个字节的大小是8位,最多可以取256个值,所以我们可以给这256个值中的每一个赋一个自然数,我相信这就是幕后发生的事情。它还解释了为什么128被排除在外:我们有128个负数,127个正数,还有零。这些加起来已经有256个了。在[1256]和[-128128]之间没有双射。

对于所有类整数数据类型的范围,这种想法是有意义的,但是当涉及浮点时,人们会看到一些奇怪的范围。例如,double的范围是[-2^{1074},(2-2^{-52})2^{1023}]。为什么会这样呢?

很抱歉记号太麻烦了,显然我不能在这里使用乳胶。

共有1个答案

司寇烨伟
2023-03-14

Java使用IEEE-754 binary64格式。在此格式中,1位代表符号(+或−,根据位是0还是1),8位用于指数,52位用于有效的初级编码。53位有效数的一位通过指数进行编码。

指数字段的值范围为0到2047。2047保留用于无穷大和nan。0用于次正规数。值1到2046用于正常数字。在此范围内,指数字段值E表示指数E=E-1023。因此e的最低值为1−1023=−1022,最高值为2046−1023=1023。指数字段值0也表示E的最低值,−1022。

53位有效数表示二进制数字d.ddd…ddd2,其中,如果指数字段为0,第一个d为0,如果指数字段为1到2046,第一个d为1。“.”后面有52位,它们由主要有效字段给出。

  • 如果E为1至2046,(−1)S•2E−1023•(1+F•2−52),
  • 如果E为0,则(−1)S•2−1022•(0+F•2−52)。

现在我们可以看到,最小的正数是当S为1,E为0,F为则表示的值为(−1)0•2−1022•(0+1•2−52)=+1•2−1022•2−52=2−1074

当S为1,E为2046,且F为则表示的值为(−1)0•22046−1023•(1+(252-1)•252=+1•21023•(21−252)=21023•(21−252)=21024−2971

 类似资料:
  • 问题内容: 在我的一个实验室的示例Java程序中,我有两种分别采用Double和double参数的不同方法。 将参数传递给它们时,如何区分它们? 问题答案: 首先,您需要了解两种类型之间的区别。 是基本类型,而是对象。 下面的代码显示了一个重载的方法,我认为它与您的实验室代码相似。 有几种方法可以调用这些方法: 这些调用将导致:

  • 我使用的是Windows 7机器,其"控制面板\时钟,语言和区域"是丹麦" 根据扫描仪的文档: 扫描仪的初始区域设置是Locale.getDefault()方法返回的值; 但当我运行代码时: 它输出“en_US”,然后抛出一个java。util。sc.nextDouble()处的输入不匹配异常。当扫描器初始化为“1,0”时,它工作 但是,如果我明确设置了区域设置: 它输出“en_US”,然后很好地

  • 问题内容: Java中float和double的范围包括什么? 为什么不建议在精度要求很高的地方使用float或double? 问题答案: Java的类的成员包含类型的Min和Max值。 检出的和静态最终成员。 (有些)人们会建议不要在精度和精度至关重要的事情上使用浮点类型,因为舍入误差可能会使可测量(少量)的量不起作用。

  • 我所知道的是: 注释是在java 5中添加的 注释可以在方法、类和属性中使用 注释可以在运行时、类、源代码中使用(我不知道如何使用类和源代码,以及它们的特性) 当java程序运行时,可以实现带有保留的注释,即运行时注释 我想实现一个注释,具有以下特性: > @MyAnnotation(allowMethods={xxx.doSomething}) public void getValue(){}

  • 问题内容: 在我的脚本中,我需要在给定开始日期和结束日期的日期范围内执行一组操作。 请为我提供使用Java实现此目的的指导。 我知道上面的代码是根本不可能的,但是我这样做是为了向您展示我想要实现的目标。 问题答案: 好吧,您可以使用Java 8的time- API 专门针对此问题(或与Java 7及更早版本等效的Joda Time类)执行类似的操作 我会 彻底 建议在内置/ 类上使用(或Joda

  • 问题内容: 为简单起见,请设想这种情况,我们有一台2位计算机,它具有一对称为r1和r2的2位寄存器,并且仅适用于立即寻址。 假设位序列 00 表示 添加 到我们的CPU中。也 01 的装置将数据移动到R 1和 10组 的装置将数据移动到R2。 因此,这台计算机和一个汇编器都有一种汇编语言,其中的示例代码将像 简而言之,当我将此代码汇编成本地语言时,文件将类似于: 上面的12位是以下代码的本机代码: