为什么 float 和 int 具有如此不同的最大值,即使它们是相同的位数?
2022-09-01 00:27:06
您可能知道,这两种类型都是32位。只能包含整数,同时还支持浮点数(如类型名称所示)。int
float
那么,最大值为231,最大值为3.4 * 10 38,而它们都是32位,这怎么可能呢?int
float
我认为的最大值容量应该高于浮点数,因为它不会为浮点数保存内存,并且只接受整数。在这种情况下,我会很高兴得到解释。int
您可能知道,这两种类型都是32位。只能包含整数,同时还支持浮点数(如类型名称所示)。int
float
那么,最大值为231,最大值为3.4 * 10 38,而它们都是32位,这怎么可能呢?int
float
我认为的最大值容量应该高于浮点数,因为它不会为浮点数保存内存,并且只接受整数。在这种情况下,我会很高兴得到解释。int
你的直觉非常正确地告诉你,一个中的信息内容不可能比另一个多,因为它们都有32位。但这并不意味着我们不能使用这些位来表示不同的值。
假设我发明了两个新的数据类型,和 。 使用4位来表示一个整数,在标准的二进制表示中,所以我们有uint4
foo4
uint4
bits value
0000 0
0001 1
0010 2
...
1111 15
但使用 4 位来表示这些值:foo4
bits value
0000 0
0001 42
0010 -97
0011 1
...
1110 pi
1111 e
现在具有比 的范围更广的值,尽管具有相同的位数!如何?因为有些值不能用 来表示,所以位映射中的那些“槽”可用于其他值。foo4
uint4
uint4
foo4
对于 和 - 它们都可以存储一组 232 个值中的值,只是 232 个值的不同集合。int
float
浮点数可能会存储更高的数字值,但即使在小数点之前的数字上,它也不会精确。请考虑以下示例:
float a = 123456789012345678901234567890f; //30 digits
Console.WriteLine(a); // 1.234568E+29
请注意,几乎没有保留任何精度。
另一方面,整数将始终精确地存储其值范围内的任何数字。
为了便于比较,我们来看一个双精度浮点数:
double a = 123456789012345678901234567890d; //30 digits
Console.WriteLine(a); // 1.23456789012346E+29
请注意,保留的有效数字大约是其两倍。