【问题标题】:Understanding Primitive Data Types: Storage Capacity/Range of int and float in Java了解原始数据类型:Java 中 int 和 float 的存储容量/范围
【发布时间】:2013-10-05 08:48:52
【问题描述】:

我正在努力深入了解 Java 的原始数据类型。我已经有了一个很好的概述,并且我了解有符号整数值是如何在 Java 中存储的,以及如何判断/计算字节、短、整数或长数据类型的范围。

所以,当查看 Java 数据类型 int 时,我知道它是一个 32 位有符号值,因此我可以准确地知道一个 int 类型可以存储多少种不同的“状态”以及该数据类型的范围是什么(即 2^32 种不同的状态,导致范围从 -2^31 到 +(2^31)-1 或大致 -2e+9 到 +2e+9)。

但是,在查看数据类型 float 时,我需要一些帮助。我知道 Java 的 float 数据类型是 32 位类型(就像 int 一样),因此我假设它也可以存储总共 2^32 种不同的状态。但是,当我查看此表中给出的数字 (http://www.javacamp.org/javaI/primitiveTypes.html) 时,我不明白这种数据类型如何存储大约 -3e+38 到 3e+38 范围内的浮点数(这已经是范围比 int 可以覆盖的范围更广)加上介于两者之间的所有单精度浮点小数 - 只有 32 位。

谁能解释一下浮点数是如何存储的以及为什么它“看起来”可以在相同的位数内存储比 int 更多的信息(这对我来说几乎是不可能的)?也许你可以给我指出一个很好的阅读或告诉我我在哪里犯了一个逻辑错误。

【问题讨论】:

标签: java floating-point int type-conversion primitive-types


【解决方案1】:

诀窍在于意识到float 无法准确地保存 -3e+38 到 3e+38 范围内的所有整数。 “相邻”浮点值之间的差异取决于大小:对于接近 0 的浮点值,相邻值之间的差异;对于非常大的值(正或负),差异可能非常大。

基本上一个浮点数包括:

  • 符号 - 正面或负面
  • 尾数或有效位(见下面的 cmets)- 有效的二进制数字字符串
  • 指数 - 尾数左移或右移的二进制位数

float 中的尾数是 23 位长,指数是 8 位 - 所以你只能得到 23 位(或归一化后为 24 位)重要信息位,但它们可以向左移动很多(形成一个巨大的数字)或很多(形成一个很小的数字)。规范化还有一些其他相关的细节,但这是基本思想。

请参阅我的面向 .NET 但仍与 Java 相关的article on binary floating point 以了解更多信息,以及one by Jeffrey Sax

【讨论】:

  • 感谢您的精彩解释并指出我阅读的内容!这很有帮助!!!
  • 小数部分的首选术语是“有效位”而不是“尾数”。 IEEE 754 标准使用“有效数字”。有效数字是线性的。尾数是对数的。尾数已很少使用,因为我们不再使用日志表进行计算。
  • @EricPostpischil:我不会声称理解其中的区别 - 但我确实注意到 JLS 使用术语“尾数”而不是“有效位”。将编辑以指向您的评论。
【解决方案2】:

为了简单起见,我将放弃所有的小玩意和 upls 的东西。让我们看一下以 10 为底的 10 位数字(在这种情况下是无符号的,但相当可扩展)。它可以存储从 0 到 9999999999 的数字。现在,让我们取其中的 2 个数字并将它们转换为指数,就像浮点数一样。现在,我们可以从 1x10-99 到 99,999,999x10^99。范围大得多

请注意,我们最多会丢失较小的数字。例如,对于不是指数的 8 位数字,999,999,999,999,999,991 和 999,999,999,999,999,992 将以相同的方式被截断,因为这些数字不适合 8 位数字。它们都是 999,999,99x1017

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-29
    • 2021-08-01
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2011-09-22
    相关资源
    最近更新 更多