4字节那么大的浮点范围是多少(±3.40282347E+38)
How is float range that large with 4 bytes (±3.40282347E+38)
int
和 float
类型都是 4 字节 in java.
那么 int
如何表示 -2,147,483,648
到 2,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
之间的数字。如您所见,范围已有效更改。
现在,让我们通过讨论 significand 和 exponent:
来正式说明一下
- 有效数字包含您的有效数字
- exponent 表示 10 乘数的指数,或者,如果它更容易,则表示您必须将小数点移动多少位(0 正好在第一个有效位之前数字)。
假设您的 "floating point" 数据类型在其 significand 中最多可包含 4 位数字,在其 exponent[=] 中最多可包含 1 位数字62=] 以及 significand 和 exponent 中的减号。
您将能够表示从 -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 它将产生正确的输出。
所以请注意:您需要完全理解这个概念。
int
和 float
类型都是 4 字节 in java.
那么 int
如何表示 -2,147,483,648
到 2,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
之间的数字。如您所见,范围已有效更改。
现在,让我们通过讨论 significand 和 exponent:
来正式说明一下- 有效数字包含您的有效数字
- exponent 表示 10 乘数的指数,或者,如果它更容易,则表示您必须将小数点移动多少位(0 正好在第一个有效位之前数字)。
假设您的 "floating point" 数据类型在其 significand 中最多可包含 4 位数字,在其 exponent[=] 中最多可包含 1 位数字62=] 以及 significand 和 exponent 中的减号。
您将能够表示从 -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 它将产生正确的输出。
所以请注意:您需要完全理解这个概念。