CS: Int和Float的表示

本文的主要目的是解答 Int 型数据和 Float 型数据占位相同的情况下,为什么 Float 表示的数据范围比 Int 大。
TL;DR
整型数据和浮点型数据,在计算机的数据表示中的规则是不同的

浮点数的二进制表示

在进行推导浮点数的二进制表示之前,需要先以十进制的表示来理解位数和数据之间的关系: $d=\sum_{i=-n}^{m}10^{i}\times d_i$ 可以用于表示 $d_{m}\cdot d_{m-1} \cdots d_{2} \cdot d_{1}.d_{-1} \cdot d_{-2} \cdots d_{-n-1}\cdot d_{-n}$。

从上面的十进制的表示可以推导出二进制的表示,只是需要将 $10$ 的幂改为 $2$ 的幂。因此 $b=\sum_{i=-n}^{m}10^{i}\times b_i$ 是用于表示二进制数据值 $b_{m}\cdot b_{m-1} \cdots b_{2} \cdot b_{1}.b_{-1} \cdot b_{-2} \cdots b_{-n-1}\cdot b_{-n}$。这种结果是将二进制值转换为对应的数据值的计算方法,但是在计算机中是遵循了一定规则去表达浮点数。

IEE754 规则

IEE 745 规定了浮点数的表示规则,采用的方式是使用 $V=(-1)^s \times \times 2^{E}$ 方式表达一个数,其中主要包括了三个部分:

  • 符号(sign) $s$ 决定这数是负数 ($s=1$) 还是正数 ($s=O$), 而对于数值 0 的符号位解释作为特殊情况处理
  • 指数部分(exponent) $E$ 的作用是对浮点数加权,这个权重是 $2^E$
  • 尾数(significand) $M$ 是一个二进制小数

以 32 位单精度为例,规定了 022 位为尾数部分,2330 位为指数部分,32 位为符号位。对应的三个部份进行了三种不同的编码表示(这里不谈论 IEE 规定的非规格化和特殊值的情况)。三个部份的分别编码为:

  • 符号位直接对应符号部分的 $s$
  • 23~30 位共 8 位二进制值 $exp=b_8b_7 \cdots b_2b_1$ 编码了指数部分 $E$。其中需要注意,在计算出 $E$ 时规格化处理。
  • 0~22 位编码了小数部分 $M$

指数部分规格化处理是最普遍的情况,即当 exp 的位模式不是全为 0 或者全为 1 情况。在这种情况中,使用了 Bias 来对之进行修正,单精度使用 127 修正,双精度使用 1023 修正: $E=\sum_{i=-n}^{m}2^{i}\times e_i-\text{bias}$

参考

  1. IEEE-754 Floating Point Converter 可以手动演算浮点数
  2. 台湾科技大学-浮点数表示解释
作者

ZenRay

发布于

2024-05-23

更新于

2024-05-23

许可协议

CC BY-NC-SA 4.0