不,不是全部,但存在一个可以准确表示所有整数的范围。
32位浮点数的结构
32bit 浮点类型使用
- 1 位符号
- 8 位为指数
- 23 位小数(隐含前导 1)
代表数字
基本上,您的表格中有一个数字
(-)1.xxxx_xxxx_xxxx_xxxx_xxxx_xxx (binary)
然后你用(无偏的)指数向左/向右移动。
要让它代表一个需要n
位的整数,您需要将其n-1
向左移动一位。(所有x
超出浮点数的 es 都为零)
用 24 位表示整数
很容易看出,我们可以表示所有需要 24 位(甚至更少)的整数
1xxx_xxxx_xxxx_xxxx_xxxx_xxxx.0 (unbiased exponent = 23)
因为我们可以随意将x
es设置为1
or 或0
.
我们可以用这种方式表示的最高数字是:
1111_1111_1111_1111_1111_1111.0
或者2^24 - 1 = 16777215
下一个更高的整数是1_0000_0000_0000_0000_0000_0000
。因此,我们需要 25 位。
用 25 位表示整数
如果您尝试表示 25 位整数(无偏指数 = 24),则数字具有以下形式:
1_xxxx_xxxx_xxxx_xxxx_xxxx_xxx0.0
您可以使用的 23 位数字都已移过浮点数。前导数字始终是 1。总共有 24 位数字。但是因为我们需要 25,所以附加了一个零。
找到最大值
我们可以表示``1_0000_0000_0000_0000_0000_0000 with the form
1_xxxx_xxxx_xxxx_xxxx_xxxx_xxx0.0 , by simply assigning
1 to all
x es. The next higher integer from that is:
1_0000_0000_0000_0000_0000_0001 . It's easy to see that this number cannot be represented accurately, because the form does not allow us to set the last digit to
1 0` : It is always
。
因此,1
后面跟 24 个零是我们可以准确表示的整数的上限。下限只是将其符号位翻转。
可以表示所有整数的范围(包括边界)
64位浮点数的结构
可以表示所有整数的范围(包括边界)
通过将相同的论证应用于 64 位浮点数的结构,这很容易实现。
注意:这并不是说这些都是我们可以表示的整数,但它为您提供了一个可以表示所有整数的范围。超出该范围,我们只能表示 2 乘以来自该范围的整数的幂。
组合论证
简单地说服自己 32 位浮点数不可能代表 32 位整数可以表示的所有整数,我们甚至不需要看浮点数的结构。
- 使用 32 位,我们可以表示 2 32种不同的事物。不多也不少。
- 一个 32 位整数使用所有这些“事物”来表示数字(成对不同)。
- 一个 32 位浮点数可以表示至少一个带有小数部分的数字。
因此,除了所有 2 32 个整数之外,32 位浮点数不可能表示这个小数。