论述:定点小数的截断与扩充
更新历史
20190405:
- 首次发布
使用定点小数,可以将小数的存储和运算,转化为整数的存储和运算。定点小数的运算,需要小心地处理位宽问题。除此以外,在硬件计算中,还经常会遇到需要对定点小数进行截断与扩充的情况。
接下来,本文将以十进制下非负定点小数为例,让读者明白为什么要对定点小数进行截断与扩充,然后讲解二进制下无符号和有符号定点小数的截断与扩充。
十进制下非负定点小数的截断与扩充
假定在十进制下用非负定点小数做如下的运算:
- A 定 A_定 A定 = 055, 1位整数部分 + 2 位小数部分,对应的实际小数为0.55
- B 定 B_定 B定 = 010300, 2位整数部分 + 4 位小数部分,对应的实际小数为1.03
- C 定 C_定 C定=( A 定 + B 定 A_定 + B_定 A定+B定)=?
嗯,这就尴尬了,位宽没对齐,没法直接做加法。不过别急,解决方案有两个。
方案1:
不对 A 定 A_定 A定进行处理,而是对 B 定 B_定 B定进行截断:
- B 定 B_定 B定的整数部分比 A 定 A_定 A定多了1位,那么就将 B 定 B_定 B定整数部分的高位去掉1位,由"01"变成"1"
- B 定 B_定 B定的小数部分比 A 定 A_定 A定多了2位,那么就将 B 定 B_定 B定小数部分的低位去掉2位,由"0300"变成"03"
于是,截断后得到:
- B 定 , 截 断 B_{定,截断} B定,截断=103,1位整数部分 + 2 位小数部分
此时, B 定 , 截 断 B_{定,截断} B定,截断的位宽和 A 定 A_定 A定是对齐的,两者就能做加法运算了,并且:虽然对 B 定 B_定 B定做了位宽截断,但是计算结果该是什么值仍然是什么值。
方案2:
不对 B 定 B_定 B定进行处理,而是对 A 定 A_定 A定进行扩充:
- A 定 A_定 A定的整数部分比 B 定 B_定 B定少了1位,那么就将 A 定 A_定 A定整数部分的高位扩充1位,由"0"变成"00"
- A 定 A_定 A定的小数部分比 B 定 B_定 B定少了2位,那么就将 A 定 A_定 A定小数部分的低位扩充2位,由"55"变成"5500"
于是,扩充后得到:
- A 定 , 扩 充 A_{定,扩充} A定,扩充=005500,2位整数部分 + 4 位小数部分
此时, A 定 , 扩 充 A_{定,扩充} A定,扩充的位宽和 B 定 B_定 B定是对齐的,两者就能做加法运算了,并且:虽然对 A 定 A_定 A定做了位宽扩充,但是计算结果该是什么值仍然是什么值。
通过上面的两个解决方案,我们可以看到:
- 可以对定点小数进行适当的位宽截断与扩充来满足计算过程中的位宽需求,而不对计算结果造成影响
二进制下定点小数的截断与扩充
对于二进制下无符号定点小数的截断与扩充,其规律和十进制下非负定点小数相同:
- 截断:整数部分从最高位开始去掉若干位,小数部分从最低位开始去掉若干位。截断可能会造成数值的改变。
- 扩充:整数部分在最高位之前扩充若干个0,小数部分在最低位之后扩充若干个0。扩充不会造成数值的改变。
注:“最高位之前”指的是比最高位更高的位。所谓的“某一位更高”,指的是二进制码的某一位所占的权重更大。
注:“最低位之后”指的是比最低位更低的位。所谓的“某一位更低”,指的是二进制码的某一位所占的权重更小。
例如:
设二进制下的一个无符号定点小数:
- A 定 A_定 A定 = 01 011 {\color{red}{01}}{\color{orange}{011}} 01011b,2bit整数部分 + 3bit小数部分,对应实际小数1.375
那么:
- 将 A 定 A_定 A定截断成“1bit整数部分 + 2bit小数部分”的定点小数后,得到: 1 01 {\color{red}{1}}{\color{orange}{01}} 101b,对应实际小数1.25 (因截断而造成了数值的略微变化)
- 将 A 定 A_定 A定扩充成“3bit整数部分 + 5bit小数部分”的定点小数后,得到: 001 01100 {\color{red}{001}}{\color{orange}{01100}} 00101100b,对应实际小数1.375
而对于二进制下有符号定点小数的截断与扩充,由于牵涉到符号位,其规律稍稍有些不同,分析可知:
- 截断:整数部分从次高位开始去掉若干位,小数部分从最低位开始去掉若干位。截断可能会造成数值的改变。
- 扩充:
- 当小数为非负数时:整数部分在次高位之前扩充若干个0,小数部分在最低位之后扩充若干个0。扩充不会造成数值的改变。
- 当小数为负数时:整数部分在次高位之前扩充若干个1,小数部分在最低位之后扩充若干个0。扩充不会造成数值的改变。
例如:
设二进制下的一个有符号定点小数:
- A 定 A_定 A定 = 1 11 011 {\color{blue}{1}}{\color{red}{11}}{\color{orange}{011}} 111011b,符号位 + 2bit整数部分 + 3bit小数部分,对应实际小数-0.625
那么:
- 将 A 定 A_定 A定截断成“符号位 + 1bit整数部分 + 2bit小数部分”的定点小数后,得到: 1 1 01 {\color{blue}{1}}{\color{red}{1}}{\color{orange}{01}} 1101b,对应实际小数-0.75 (因截断而造成了数值的略微变化)
- 将 A 定 A_定 A定扩充成“符号位 + 3bit整数部分 + 5bit小数部分”的定点小数后,得到: 1 111 01100 {\color{blue}{1}}{\color{red}{111}}{\color{orange}{01100}} 111101100b,对应实际小数-0.625