真值转换为 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,用二进制表示:
- 首先,将 12.75 转换为二进制:
- 12 转换为二进制为 $1100_2(即 2^3 + 2^2)$
- 0.75 转换为二进制为 $0.11_2(即 0.5 + 0.25)$
所以,12.75 的二进制表示为 $1100.11_2$。
- 将这个数表示为规格化的浮点数形式:
- 我们需要将小数点左移,直到左边只有一个有效数字(即 1)。
- $1100.11_2$ 可以写成 $1.10011_2 \times 2^3$。
这就是规格化形式,其中:
- 尾数 $M = 1.10011_2$
- 指数 (E = 3)
- 最终,12.75 在浮点数规格化表示中为:
在计算机内部,浮点数存储时通常采用 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 单精度浮点数:
- 12.75 的二进制表示为
1100.11。 - 规格化为
1.10011 × 2^3。 - 偏移后的指数
E = 130,即10000010。 - 尾数
M = 10011000000000000000000。 - 最终的 IEEE 754 表示为
414C0000H。
IEEE 754 转为真值
例子
问题:浮点数 4136000H 转为真值(这个 H 表示为十六进制)
1. 十六进制转换为二进制
41360000H 转换为二进制为:
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) 为:
将小数部分 0.011011_2 转换为十进制:
因此尾数 (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 位用于符号
- 8 位用于指数(带有偏移值 127)
- 23 位用于尾数的存储。
1. 符号位
0 正 1 负,就这个简单的道理
2. 指数部分
- 真值转 IEEE754 要加 127 偏移量,然后转二进制
- IEEE754 转真值要减 127 偏移量,然后转二进制
3. 尾数处理部分
因为,尾数部分的范围是: \(1 \leq M < 2\)
- 真值转为 IEEE754
- 规格化后,将小数部分(包含 0 的)(即尾数部分)补充到 23 位就是所谓的要的部分了
- IEEE754 转真值
- 取后 23 位,转为二进制小数,然后转为十进制。因为一开始省略了个 1 的,所以要加回来。