1. IEEE 754 浮点数结构

IEEE 754 浮点数由三个部分组成:

  • 符号位(1 位):用于表示数的正负,0 表示正数,1 表示负数。
  • 指数位(单精度 8 位,双精度 11 位):用于存储指数,并使用偏移(Bias)来表示。单精度偏移值为 127,双精度偏移值为 1023。
  • 尾数位(单精度 23 位,双精度 52 位):用于存储有效数字的小数部分。对于规格化数,会有一个“隐含位” 1,不会存储在尾数字段里,而对于非规格化数,则没有隐含位。

下面是一张示意图,展示了单精度浮点数的整体结构(1 位符号 + 8 位指数 + 23 位尾数):


2. 浮点数的表示方法

在计算机内部,浮点数使用一种类似科学记数法的二进制形式来表示。


3. 规格化数与非规格化数

在 IEEE 754 中,根据指数字段的值,浮点数分为两类:规格化数(Normalized)非规格化数(Denormalized)

两者的主要区别在于指数字段是否为全 0,以及尾数部分是否存在“隐含位” 1。

规格化数(Normalized)

当指数字段不全为 0 时,该数属于规格化数。这时,尾数部分默认存在一个 1 在小数点前,但这一位不会直接存储,称为“隐含位”(Implicit Leading 1)。省略隐含位可以多利用一位空间来表示尾数,从而提高数值精度。

非规格化数(Denormalized)

当指数字段全为 0 时,该数属于非规格化数。此时,尾数不再附加隐含位,实际存储的尾数从 0. … 开始。非规格化数用于表示非常接近 0 的数值,虽然精度不如规格化数高,但能够覆盖规格化数所无法表示的最小范围,保证浮点数在接近 0 时的连续性。

举例说明

尾数字段是:

10100000000000000000000

对于规格化数



对于非规格化数

计算方式一样,但没有加 1, 实际尾数 = 0.625


4. 指数存储范围

单精度浮点数的指数字段为 8 位,可表示 0 到 255 共 256 种组合。

但在 IEEE 754 中,这 0–255 并不全部对应真实指数值:

  • 指数全 0(00000000):表示非规格化数或零,而不是一个正常指数。
  • 指数全 1(11111111):表示特殊值,包括无穷大(Infinity)和 NaN(Not a Number),也不对应正常指数。
  • 真正用于规格化数的指数范围是 1 到 254,对应的真实指数范围为 −126 到 +127。

因此,单精度浮点数所能表示的指数范围(有效指数)是 −126 到 +127。


5. 隐含位(Hidden Bit)

在 IEEE 754 规范中,所有规格化数都可以写为:

1.xxxxxx₂ × 2^exp

由于小数部分的整数位始终是 1,可用“隐含位”来表示:存储时不必再写出这一位,仅需记录小数部分。这样就相当于多节省了一位存储空间,提高了尾数的有效位数。 例如,尾数字段存储 101000…,实际尾数应为 1.101₂ = 1 + 0.625 = 1.625。如果去掉隐含位,则只需存储 0.101₂ 部分,即二进制 101000…。


6. 十进制与二进制

在浮点数表示中,需要将十进制小数转换为二进制小数,或者将二进制小数转换回十进制:

  • 十进制转二进制:将小数部分乘以 2,不断取整数部分,直到小数部分为 0 或达到所需精度。例如 0.625 转为二进制就是 0.101₂。

  • 二进制转十进制:将每一位的 2^⁻k 相加,例如 0.101₂ = 1×2⁻¹ + 0×2⁻² + 1×2⁻³ = 0.5 + 0 + 0.125 = 0.625。


7. 丢失精度

浮点数并不能精确表示所有十进制小数,主要原因有以下两点: