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

b4qexyjb  于 2023-04-01  发布在  其他
关注(0)|答案(4)|浏览(133)

可能重复:

what the difference between the float and integer data type when the size is same in java?
您可能知道,这两种类型都是32位的。int只能保存整数,而float还支持floating point数字(正如类型名称所示)。
那么,int是231,float是3.4*1038,而它们都是32位,这是怎么可能的呢?
我认为int容量应该比float高,因为它不为浮点数保存内存,只接受整数。

6jygbczu

6jygbczu1#

你的直觉很正确地告诉你,一个中的信息量不会比另一个多,因为它们都有32位。但这并不意味着我们不能用这些位来表示不同的值。
假设我发明了两种新的数据类型,uint4foo4

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表示,所以位Map中的这些“槽”可用于其他值。
intfloat也是一样的--它们都可以存储一组232个值中的值,只是不同的232个值。

ukxgm1gy

ukxgm1gy2#

一个float可能存储一个更大的数值,但它甚至在小数点之前的数字上也不精确。考虑下面的例子:

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

请注意,几乎没有保持任何精度。
另一方面,整数总是精确地存储其值范围内的任何数字。
为了便于比较,我们来看一个双精度浮点数:

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

请注意,保留的有效位数大约是原来的两倍。

wa7juj8i

wa7juj8i3#

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

n9vozmp4

n9vozmp44#

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

相关问题