为什么float和int具有不同的最大值,即使它们的位数相同?

时间:2012-06-22 14:43:18

标签: c# java c++ floating-point int

  

可能重复:
  what the difference between the float and integer data type when the size is same in java?

您可能知道,这两种类型都是32位。int只能包含整数,而float也支持floating point个数字(如类型名称所示)。

如何int的最大值是2 31 float的最大值是3.4 * 10 38 ,虽然它们都是32位?

我认为int的最大值容量应该高于浮点数,因为它不会为浮点数保存内存并且只接受整数。在这种情况下,我很乐意作出解释。

4 个答案:

答案 0 :(得分:45)

你的直觉非常正确地告诉你,不能再有信息内容,因为它们都有32位。但这并不意味着我们不能将这些位用于表示不同的值。

假设我发明了两种新的数据类型uint4foo4uint4使用4位来表示标准二进制表示中的整数,因此我们有

bits   value
0000       0
0001       1
0010       2
...
1111      15

但是foo4使用4位来表示这些值:

bits   value
0000       0
0001      42
0010     -97
0011       1
...
1110      pi
1111       e

现在foo4有一个更宽范围的值,而不是uint4,尽管位数相同!怎么样?由于某些uint4无法foo4表示,因此位映射中的“插槽”可用于其他值。


intfloat的情况相同 - 它们都可以存储来自一组2个 32 值的值,只是不同的集合2 32 值。

答案 1 :(得分:12)

浮点数可能会存储更高的数字值,但即使在小数点前的数字上也不准确。 请考虑以下示例:

float a = 123456789012345678901234567890f; //30 digits
Console.WriteLine(a);  // 1.234568E+29

请注意,几乎没有任何精确度。

另一方面,整数将始终精确地存储其值范围内的任何数字。

为了便于比较,让我们看一下双精度浮点数:

double a = 123456789012345678901234567890d; //30 digits
Console.WriteLine(a); // 1.23456789012346E+29

请注意,保留的有效数字大约是其两倍。

答案 2 :(得分:4)

这些基于IEEE754浮点规范,这就是为什么它是可能的。请阅读此documentation。它不只是关于多少位。

答案 3 :(得分:4)

提示位于“浮点”的“浮动”部分。你说的基本上是假定的。浮点数不会为小数点后的数字“保留空间” - 它具有有限的位数(23个二进制)并记住2乘以2的幂。