论述:定点小数的截断与扩充

论述:定点小数的截断与扩充

更新历史
20190405:

  1. 首次发布

使用定点小数,可以将小数的存储和运算,转化为整数的存储和运算。定点小数的运算,需要小心地处理位宽问题。除此以外,在硬件计算中,还经常会遇到需要对定点小数进行截断与扩充的情况。

接下来,本文将以十进制下非负定点小数为例,让读者明白为什么要对定点小数进行截断与扩充,然后讲解二进制无符号和有符号定点小数截断与扩充

十进制下非负定点小数的截断与扩充

假定在十进制下用非负定点小数做如下的运算:

  • 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

你可能感兴趣的:(硬件逻辑开发,定点小数)