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

idi*_*ish 28 c# c++ java floating-point int

可能重复:
当java中的大小相同时,float和integer数据类型之间有什么区别?

您可能知道,这两种类型都是32位.int只能包含整数,float而且还支持浮点数(如类型名称所示).

那么最大值int是2 31,最大值 float是3.4*10 38,而它们都是32位,怎么可能呢?

我认为int最大值容量应该高于浮点数,因为它不会为浮点数保存内存,只接受整数.在那种情况下,我会很高兴得到解释.

Aak*_*shM 47

你的直觉非常正确地告诉你,在一个中没有更多的信息内容,因为它们都有32位.但这并不意味着我们不能使用这些位来表示不同的值.

假设我发明了两种新的数据类型,uint4并且foo4.uint4在标准二进制表示中使用4位来表示整数,所以我们有

bits   value
0000       0
0001       1
0010       2
...
1111      15
Run Code Online (Sandbox Code Playgroud)

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

bits   value
0000       0
0001      42
0010     -97
0011       1
...
1110      pi
1111       e
Run Code Online (Sandbox Code Playgroud)

尽管具有相同的位数,但现在foo4具有广泛的值uint4!怎么样?因为有些uint4无法表示foo4,所以位映射中的"槽"可用于其他值.


这是相同的intfloat-它们可以从一组2倍的两个存储值32的值,只是不同组2个的32值.

  • 非常有趣,易于理解(虽然不是技术性的)解释.我喜欢. (6认同)

Rot*_*tem 12

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

float a = 123456789012345678901234567890f; //30 digits
Console.WriteLine(a);  // 1.234568E+29
Run Code Online (Sandbox Code Playgroud)

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

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

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

double a = 123456789012345678901234567890d; //30 digits
Console.WriteLine(a); // 1.23456789012346E+29
Run Code Online (Sandbox Code Playgroud)

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

  • 您正在此处演示写入控制台。这真的告诉我们关于精度的任何事情吗? (4认同)

kos*_*osa 6

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