跳转至

真值转换为 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 转换为二进制:
  2. 12 转换为二进制为 \(1100_2(即 2^3 + 2^2)\)
  3. 0.75 转换为二进制为 \(0.11_2(即 0.5 + 0.25)\)

所以,12.75 的二进制表示为 \(1100.11_2\)

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

这就是规格化形式,其中: - 尾数 \(M = 1.10011_2\) - 指数 \(E = 3\)

  1. 最终,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. 尾数部分处理

  4. 1 位用于符号

  5. 8 位用于指数(带有偏移值 127)
  6. 23 位用于尾数的存储。

1. 符号位

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

2. 指数部分

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

3. 尾数处理部分

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

  1. 真值转为 IEEE754
  2. 规格化后,将小数部分(包含 0 的)(即尾数部分)补充到 23 位就是所谓的要的部分了

  3. IEEE754 转真值

  4. 取后 23 位,转为二进制小数,然后转为十进制。因为一开始省略了个 1 的,所以要加回来。