4字节那么大的浮点范围是多少(±3.40282347E+38)

How is float range that large with 4 bytes (±3.40282347E+38)

intfloat 类型都是 4 字节 in java.

那么 int 如何表示 -2,147,483,6482,147,483,647 的范围,其中 float 大约有 ±3.40282347E+38F 而两者具有相同的有限数量字节数?

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

"Floating" 点意味着您的号码的小数部分的位数可以更改以表示您的号码 "as best as possible" 鉴于其大小所规定的限制。

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

现在,让我们通过讨论 significandexponent:

来正式说明一下
  • 有效数字包含您的有效数字
  • exponent 表示 10 乘数的指数,或者,如果它更容易,则表示您必须将小数点移动多少位(0 正好在第一个有效位之前数字)。

假设您的 "floating point" 数据类型在其 significand 中最多可包含 4 位数字,在其 exponent[=] 中最多可包含 1 位数字62=] 以及 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 位作为 significand 和 1 位作为有效数的符号)。

维基百科是一个很好的起点。通常,编程目的的主要收获是了解给定数据类型(您的 "precision")可以存储多少个小数位,因为这将决定哪种特定的小数格式最适合您的目的。

有关详细信息,请参阅以下 link: 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 它将产生正确的输出。

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