前言
备考软考初级程序员证书时,卡在单精度浮点数规格化问题,教程及网络资料讲解过于专业化,故搜集资料后自行整理了解题过程,在此做个记录,希望能帮到各位,有问题欢迎评论区指出。
- 个人主页
- 参考资料:规格化浮点数-百度百科
题型
利用 IEEE 754 标准将八/十/十六进制数表示为单精度浮点数。
公式
( − 1 ) S × 1. M × 2 P − x \left ( -1 \right )^{S}\times 1.M\times 2^{P-x} (−1)S×1.M×2P−x
- S 为数的符号位,0 表示正数,1 表示负数
- M 为尾数,IEEE 754 标准规定尾数最高有效位为 1【即:应为“1.XXX…XX”的格式】
- P 为阶码
- x 为偏移值,单精度时为 127,双精度时为 1023
解题步骤
- 将八/十/十六进制数转换为二进制数;
- 将二进制数表示为浮点数形式: 2 E × F 2^{E}\times F 2E×F (E 为阶码,F 为尾数);
- 按照 IEEE 754 标准将浮点数转换为相应精度的浮点数;
- F 转换为 1.M 的格式
- E 转换为 P-x 的格式
- 代入公式: ( − 1 ) S × 1. M × 2 P − x \left ( -1 \right )^{S}\times 1.M\times 2^{P-x} (−1)S×1.M×2P−x
- 得出 S、P、M 的值,均要转换为二进制;
- 根据题目要求的精度补齐位数,不足补 0:
- 单精度(32 位):S 占 1 位,P 占 8 位,M 占 23 位;
- 双精度(64 位):S 占 1 位,P 占 11 位,M 占 52 位;
例题
1)正十进制数转换为单精度浮点数:176.0625
( 176.0625 ) 10 (176.0625)_{10} (176.0625)10
⇒ ( 10110000.0001 ) 2 \Rightarrow (1011 0000.0001)_{2} ⇒(10110000.0001)2
⇒ 0.101100000001 × 2 8 \Rightarrow 0.1011 0000 0001\times 2^{8} ⇒0.101100000001×28【类似于十进制的科学技术法,此处为浮点表示法】
⇒ 1.01100000001 × 2 7 \Rightarrow 1.0110 0000 001\times 2^{7} ⇒1.01100000001×27
⇒ ( − 1 ) 0 × ( 1.011000000010 ) × 2 134 − 127 \Rightarrow (-1)^{0}\times (1.0110 0000 0010)\times 2^{134-127} ⇒(−1)0×(1.011000000010)×2134−127
代入公式得:S=0, M=01100000001, P=134=10000110
补齐 32 位得:0 | 1000 0110 | 0110 0000 0010 0000 0000 000
2)负十进制数转换为单精度浮点数:-0.125
( − 0.125 ) 10 (-0.125)_{10} (−0.125)10
⇒ ( − 0.001 ) 2 \Rightarrow (-0.001)_{2} ⇒(−0.001)2
⇒ − 1 × 2 − 3 \Rightarrow -1\times 2^{-3} ⇒−1×2−3
⇒ ( − 1 ) 1 × ( 1.0 ) × 2 124 − 127 \Rightarrow (-1)^{1}\times (1.0)\times 2^{124-127} ⇒(−1)1×(1.0)×2124−127
代入公式得:S=1, M=0, P=124=01111100
补齐 32 位得:1 | 0111 1100 | 0000 0000 0000 0000 0000 000