【问题标题】:How is float range that large with 4 bytes (±3.40282347E+38) [duplicate]4字节(±3.40282347E + 38)的浮点范围如何大[重复]
【发布时间】:2019-08-12 06:39:20
【问题描述】:

intfloat 类型在 java 中都是 4 字节

那么int 怎么能代表-2,147,483,6482,147,483,647 的范围,其中float 大约有±3.40282347E+38F,而两者的字节数相同?

根据我的理解,两者应该具有相同的范围,因为它们具有相同的字节数。有人能解释一下float 是如何代表这么大的范围的吗?

【问题讨论】:

  • 了解floating point numbers。基本上,它并不代表从 -3*10^38 到 3*10^38每个实数
  • -3*10^38 到 3*10^38 之间有无数个实数,所以很自然,float 类型只能代表其中的一小部分,不管你有多少字节利用。由于它的范围比int 类型更大,这意味着浮点类型甚至不能表示该范围内的所有整数。
  • this 也可能有帮助。
  • 缩放。基本上二进制浮点数表示尾数 x 2^scale。其中尾数和比例被打包到 32 位浮点表示中。这意味着大约有 2^32 个不同的值,它们不均匀地分布在整个范围内。

标签: java floating-point int


【解决方案1】:

“浮动”点意味着您的数字的小数部分的位数可以改变以“尽可能”地表示您的数字,因为它的大小受到限制。

让我们暂时忘记 float 数据类型的 4 个字节,并假设您的“浮点”类型最多可以存储 10 位数字加上负号。 这意味着您可以准确地表示从 :-9 999 999 999+9 999 999 999 的数字。 但是,如果您想要一位小数,您可以准确地表示从-999 999 999.9+999 999 999.9 的数字。如您所见,范围已经有效地改变了。

现在,让我们通过讨论 significandexponent 来正式化一下解释:

  • significand 包含您的有效数字
  • exponent 表示 10 乘数的指数,或者如果更简单的话,表示您必须移动小数点的位置(0 位于第一个有效数字之前)。李>

假设您的“浮点”数据类型在其 significand 中最多可以有 4 位数字,在其 exponent 中最多可以有 1 位数字,加上减号significandexponent 中的符号。 您将能够表示从-0.9 999 * 10^9 = -999900000+0.999 9 * 10^9 = +999900000 的数字。正如您所看到的,虽然数字很大,但您无法准确表示大多数大数字,因为您只有 4 位数字可用于表示。这种精度损失可以通过表示非常小的数字的能力得到补偿,例如,您可以表示 0.999 9 * 10^-9 = 0.000 000 000 999 9

这解释了为什么范围如此之大,尽管大小只有 4 个字节,如您的问题所述。


为了完善您对此事的了解,请将上述概念转换为二进制(您的典型float 使用 4 位作为 指数,23 位用于 有效位 和 1有效数字的符号位)。

维基百科是一个很好的起点。通常,编程目的的主要内容是了解在给定数据类型(您的“精度”)的情况下可以存储多少个十进制数字,因为这将决定哪种特定的十进制格式最适合您的目的。

有关详细信息,请参阅以下链接: https://en.wikipedia.org/wiki/Floating-point_arithmetic#IEEE_754:_floating_point_in_modern_computers

请注意,理解二进制系统中浮点数的概念在信息技术中极为重要,因为即使是最简单的计算也会受到它的严重影响。

在计算机上表示的浮点数(二进制)例如是编写如下内容的原因:

public class MyClass {
    public static void main(String args[]) {
      double x=0.1f;
      double y=0.2f;
      double z=0.3f;

      if(x+y == z) {
          System.out.println("something");
      }
      else {
          System.out.println("something else");
      }
    }
}

会反直觉地输出something else,但如果您开始使用数字或将类型更改为float,它将产生正确的输出。

所以请注意:您需要完全理解这个概念。

【讨论】:

  • 请注意,您的代码示例是 javascript,但问题是用 java 标记的。
  • 该死我的懒惰... :)
  • 浮点数小数部分的首选术语是“有效位”。 “尾数”是对数的小数部分的旧术语。尾数是对数的(添加到尾数会乘以表示的值),而有效数是线性的(添加到有效数会在表示的值上增加一些东西,根据指数比例)。
  • 是的。将修改答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-12
  • 2016-02-27
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-12
相关资源
最近更新 更多