真值转换为 IEEE 754

浮点数的规格化表示是指将浮点数的数值调整为特定格式,使得浮点数的表示更加规范、精确和有效率。通常,浮点数表示为以下形式:

\[x = (-1)^s \times M \times 2^E\]
  • (s) 是符号位,用于表示数的正负,0 表示正数,1 表示负数;
  • (M) 是有效数字,也称为尾数(Mantissa),是规格化后的浮点数的“主要部分”;
  • (E) 是指数(Exponent),表示这个数需要乘以 2 的多少次方。

为了使浮点数唯一,==尾数 M 需要进行规格化==,也就是说它要满足以下条件:

\[1 \leq M < 2\]

## 举例:

假设我们有一个浮点数 12.75,用二进制表示:

  1. 首先,将 12.75 转换为二进制:
    • 12 转换为二进制为 $1100_2(即 2^3 + 2^2)$
    • 0.75 转换为二进制为 $0.11_2(即 0.5 + 0.25)$

    所以,12.75 的二进制表示为 $1100.11_2$。

  2. 将这个数表示为规格化的浮点数形式:
    • 我们需要将小数点左移,直到左边只有一个有效数字(即 1)。
    • $1100.11_2$ 可以写成 $1.10011_2 \times 2^3$。

    这就是规格化形式,其中:

    • 尾数 $M = 1.10011_2$
    • 指数 (E = 3)
  3. 最终,12.75 在浮点数规格化表示中为:
\[12.75 = 1.10011_2 \times 2^3\]

在计算机内部,浮点数存储时通常采用 IEEE 754 标准格式。对于 32 位浮点数格式:

  • 1 位用于符号;
  • 8 位用于指数(带有偏移值 127);
  • 23 位用于尾数的存储。

使用 IEEE 754 标准

1. 计算偏移后的指数

IEEE 754 单精度浮点数使用偏移量为 127 的表示法,因此我们要将实际指数 3 加上偏移量 127,得到:

E = 3 + 127 = 130

130 转换为二进制是 10000010

2. 符号位

12.75 是正数,因此符号位 S = 0

3. 尾数

尾数部分是规格化后的 1.10011,==省略前面的隐含 1 ==,只需记录小数点后的部分。

10011 填入 23 位的尾数位中,右边补 0,得到:

M = 10011000000000000000000(的确23位)

4. 组合 IEEE 754 表示

现在我们已经有了符号位、指数和尾数:

  • 符号位 S = 0
  • 指数位 E = 10000010
  • 尾数位 M = 10011000000000000000000

将它们组合在一起,得到 IEEE 754 单精度浮点数的二进制表示:

0 10000010 10011000000000000000000B(这个B表示为二进制的意思)

5. 转换为十六进制表示

将这个 32 位二进制数转换为十六进制:

0100 0001 0100 1100 0000 0000 0000 0000

对应的十六进制表示为:

414C0000H(H表示十六进制)

结果:

12.75 的 IEEE 754 单精度浮点数表示为 414C0000H


总结:

通过以下步骤,将 12.75 转换为 IEEE 754 单精度浮点数:

  1. 12.75 的二进制表示为 1100.11
  2. 规格化为 1.10011 × 2^3
  3. 偏移后的指数 E = 130,即 10000010
  4. 尾数 M = 10011000000000000000000
  5. 最终的 IEEE 754 表示为 414C0000H

IEEE 754 转为真值

例子

问题:浮点数 4136000H 转为真值(这个 H 表示为十六进制)

1. 十六进制转换为二进制

41360000H 转换为二进制为:

\[0100\ 0001\ 0011\ 0110\ 0000\ 0000\ 0000\ 0000_2\]

2. 解析符号位

第 1 位是 0,表示符号为正。

3. 解析指数部分

第 2 到第 9 位:$10000010_2$ ,转换为十进制是:

\[10000010_2 = 130_{10}\]

减去偏移量 127,实际指数 (E) 为:

\[E = 130 - 127 = 3\]

4. 解析尾数部分

尾数部分是第 10 到第 32 位:$01101100000000000000000_2$。

IEEE 754 规格化浮点数默认在尾数前有隐含的 1,所以实际尾数 (M) 为:

\[M = 1 + 0.011011_2\]

将小数部分 0.011011_2 转换为十进制:

\[0.011011_2 = 0.375_{10}\]

因此尾数 (M) 为:

\[M = 1 + 0.375 = 1.375\]

5. 计算真值

根据公式 $x = (-1)^s \times M \times 2^E$,将数值代入:

\[x = 1.375 \times 2^3 = 1.375 \times 8 = 11.375\]

最终结论

所以 41360000H 对应的真值确实是 11.375


最终总结

[!NOTE] 其实整个过程无非就三步:

  1. 符号位
  2. 指数部分处理
  3. 尾数部分处理
  • 1 位用于符号
  • 8 位用于指数(带有偏移值 127)
  • 23 位用于尾数的存储。

1. 符号位

0 正 1 负,就这个简单的道理

2. 指数部分

  • 真值转 IEEE754 要加 127 偏移量,然后转二进制
  • IEEE754 转真值要减 127 偏移量,然后转二进制

3. 尾数处理部分

因为,尾数部分的范围是: \(1 \leq M < 2\)

  1. 真值转为 IEEE754
    • 规格化后,将小数部分(包含 0 的)(即尾数部分)补充到 23 位就是所谓的要的部分了
  2. IEEE754 转真值
    • 取后 23 位,转为二进制小数,然后转为十进制。因为一开始省略了个 1 的,所以要加回来。