【定点数运算】定点的乘法和加法

目录

定点的介绍

定点的优势

定点数的乘法和加法

乘法

加法


定点的介绍

在之前的博客中介绍了定点数和浮点数,想要了解的可以前往以下链接:

【定点和浮点】定点数与浮点数的解释

定点的优势

使用定点表示有什么优势?为什么不简单地将所有值规范化为整数范围并处理整数。将所有值规范化为整数,这会产生非常不可读的代码和文档。在观察某些代码时,定点通常更加方便。例如,如果我正在查看源代码,如下代码所示:

c0 = fixbv(0.0032, min=-1, max=1, res=2**-15)
c1 = fixbv(-0.012, min=-1, max=1, res=2**-15)

可以很容易地将其与滤波器的系数联系起来,但是如果只看到整数:

c0 = intbv(0x0069, min=-2**15, max=2**15)
c1 = intbv(-0x0189, min=-2**15, max=2**15)

需要在看其他信息。仅整数很难理解这些值要表示的内容。

除了表示优势之外,用于处理舍入和溢出的情况时,在定点数据中也很常见。

定点数的乘法和加法

定点数的乘法操作和普通的十进制数相乘可以用很类似的方法——列式子计算;同理定点数的加法也是类似。

乘法

在计算定点数的乘法时,只要将数值转换成二进制,可以暂时先忽略小数点的存在,因为之前说过,定点数之所以叫定点数,就是因为它的小数点位置是固定的,因此,可以先做计算再定小数点的位置。

下面是一个示例,以两个数分别为 6.5625(一共8位,其中3位整数部分,4位小数部分)和 4.25 (一共8位,其中5位整数部分,2位小数部分)两个数的相乘。

0110.1001  == 6.5625
000100.01  == 4.25
          01101001  
        x 00010001  
      ------------
          01101001
         00000000 
        00000000  
       00000000  
      01101001    
     00000000      
    00000000
   00000000 
 --------------------
  x000011011111001   ==  0000011011.111001  ==  27.890625
 
 

乘积结果所需的位数是两个数值的位数之和。通常,乘法和加法的结果要调整大小并减少位数。在定点中,这具有直观的意义,因为较小的小数位被丢弃,并且值根据丢弃的位四舍五入。这样可以减少数据的位宽,以达到减少位宽的作用。

加法

加法稍微复杂一些,因为在做加法之前需要对齐小数点。使用与乘法例子中相同的数值:

0110.1001  == 6.5625
000100.01  == 4.25
            0110.1001  
        + 000100.01  
        -------------
          001010.1101  ==  10.8125

猜你喜欢

转载自blog.csdn.net/m0_61298445/article/details/123884633