真值转换为 IEEE 754
浮点数的规格化表示是指将浮点数的数值调整为特定格式,使得浮点数的表示更加规范、精确和有效率。通常,浮点数表示为以下形式:
$$
x = (-1)^s \times M \times 2^E
$$
- \(s\) 是符号位,用于表示数的正负,0 表示正数,1 表示负数;
- \(M\) 是有效数字,也称为尾数(Mantissa),是规格化后的浮点数的“主要部分”;
- \(E\) 是指数(Exponent),表示这个数需要乘以 2 的多少次方。
为了使浮点数唯一,尾数 M 需要进行规格化,也就是说它要满足以下条件:
## 举例:
假设我们有一个浮点数 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,得到:
130 转换为二进制是 10000010。
2. 符号位
12.75 是正数,因此符号位 S = 0。
3. 尾数
尾数部分是规格化后的 1.10011,==省略前面的隐含 1 ==,只需记录小数点后的部分。
将 10011 填入 23 位的尾数位中,右边补 0,得到:
4. 组合 IEEE 754 表示
现在我们已经有了符号位、指数和尾数:
- 符号位
S = 0 - 指数位
E = 10000010 - 尾数位
M = 10011000000000000000000
将它们组合在一起,得到 IEEE 754 单精度浮点数的二进制表示:
5. 转换为十六进制表示
将这个 32 位二进制数转换为十六进制:
对应的十六进制表示为:结果:
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 转换为二进制为:
2. 解析符号位
第 1 位是 0,表示符号为正。
3. 解析指数部分
第 2 到第 9 位:\(10000010_2\) ,转换为十进制是:
减去偏移量 127,实际指数 \(E\) 为:
4. 解析尾数部分
尾数部分是第 10 到第 32 位:\(01101100000000000000000_2\)。
IEEE 754 规格化浮点数默认在尾数前有隐含的 1,所以实际尾数 \(M\) 为:
将小数部分 0.011011_2 转换为十进制:
因此尾数 \(M\) 为:
5. 计算真值
根据公式 \(x = (-1)^s \times M \times 2^E\),将数值代入:
最终结论
所以 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 的,所以要加回来。