文章状态:
- 修复中
- 待改善,但能用 (feat: 需要增加一个更全面的例子)
- 已修复
规定浮点数的符号位为1
位,指数位为3
位,尾数位为5
位,现有两个浮点数:1.25
和13.5
1.25
浮点数表示为二进制格式:0 011 01000
13.5
浮点数表示为二进制格式:0 110 10110
小小验算一下:
0 011 01000
表示一个正数,指数位为3(移码bisas
=3),故实际exp=0
,1.01000B * 20 = 1.01000B = 1.250 110 10110
表示一个正数,指数位为6,减去偏置得到实际exp=3
,1.10110B * 23 = 1101.10B = 13.5
现在要计算1.25+13.5
,可按以下步骤计算:
一. 对阶
首先,指数位要相同才可进行尾数位的相加。指数位的相同可通过Δ
来调节,其中Δ
=|exp大-exp小|。1.25和13.5的Δ为|110B-011B| = |6-3| = 3,将1.01000 * 20 表示为 0.00101 * 23
为什么不是把13.5 的阶码110 变为011?如果由110 变为011,则13.5 的尾数部分就需要左移,而左移的对象几乎包含所有高位,相较于右移包含低位,对浮点运算的影响更大。
二. 尾数加减运算
现在1.25尾数表示为00101
13.5尾数表示为10110
尾数运算:
相加后得到的真实结果就是:1.11011 * 23 = 1110.11B = 14.75 D,这和手算的结果是一致的。
三. 运算结果规格化
所谓规格化就是在尾数相加完毕之后,有可能无法满足1.M
的表示方式(比如尾数产生进位,那么隐式小数点前面的数就变成了10),规格化就是将计算之后的数重新转化为1.M
的正确表示方式。
由于现在得到的浮点结果就是规范数,所以此步不需要进行规范化。
四. 舍入处理
一般计算机采用先偶数舍入(也称向最接近的值舍入),本例运算的所有结果可以在9 位bit 范围内表示,因此无需考虑舍入处理。
五. 溢出判断
这次运算并阶码exp
没有发生溢出,因此这一步也是不需要进行任何操作的。
因此,最终得到的结果,表示为:0 110 11011
参考文献: