目录
定点的介绍
在之前的博客中介绍了定点数和浮点数,想要了解的可以前往以下链接:
定点的优势
使用定点表示有什么优势?为什么不简单地将所有值规范化为整数范围并处理整数。将所有值规范化为整数,这会产生非常不可读的代码和文档。在观察某些代码时,定点通常更加方便。例如,如果我正在查看源代码,如下代码所示:
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