在谈论之前我们首先该当弄清楚以下几个观点:
什么是定点数和浮点数?以及它们之间的差异。定点数:指的是在实际硬件中,我们如果要表示小数,那么小数点在打算机中的位置是隐蔽在某一固定位置上,而该位置是由程序员自己定义且也只有程序员自己知道,固通过变换我们能够精确表示出当前整数表示的实际小数,这样的处理办法成为定点数。

浮点数:指的是在打算机中以近似表示任意某个实数,详细来说便是,这个实数由一个整数和尾数乘以某个基数的整数次幂得到,类似于我们学的科学基数法。这里叫浮点相对付定点便是这个小数点位置是非固定的。

在实际的打算机中浮点数因此下面格式进行存储的:
IEEE754的浮点标准:单精度浮点数 float:32 位,符号位 S 占 1 bit,指数 E 占 8 bit,尾数 M 占 23 bit;双精度浮点数 float:64 位,符号位 S 占 1 bit,指数 E 占 11 bit,尾数 M 占 52 bit。
假设对付一个浮点数30.125,那么假设用单精度32bit来表示一个浮点数,那么上图各位依次是:
整数:30(十进制) 11110(二进制)
小数:0.125(十进制) 0.001(二进制)
30.125(十进制) = 11110.001(二进制)=1.11100012^4(二进制)
以是:S=0 E=4'b00000100 M=23'b111 0001 0000 0000 0000 0000
什么是定点处理器和浮点处理器?以及它们之间的差异定点处理器:便是只能进行整数运算的逻辑单元,一样平常这类处理器的特点便是价格便宜,处理速率快,受硬件影响其运算精度一样平常都不会特殊高。
浮点处理器:便是芯片内部集成了特意处理浮点的硬件处理单元,其能够在较快速率下完成高精度的幅度运算,但是这类处理器一样平常价格昂贵。
在实际运用中到底是用定点处理器还是浮点处理器,紧张要看详细的运用处景,如果一个算法本身涉及大量的高精度浮点运算,那么这个时候如果用定点处理器去处理,那么其综合代价大概要比浮点处理器还高。
怎么用定点数代表浮点数?我们在实际进行DSP中,常常须要进行小数运算,而在现实实际中我们运用到的DSP硬件处理器大多数是定点处理器,这个时候如果我们还须要进行浮点运算,就须要我们人为的对对整数进行小数点的定标,通过这样的处理办法就能利用定点处理器进行浮点运算。
在实际硬件中,所有的小数都以下图所示的办法表示,其紧张分为整数位宽.小数位宽。
假设当前硬件的数据位宽是16bits,那么对付任何小数我们都因此这16bit整数来表示,这个16bit数能够表示的范围和精度就取决于我们到底拿出多少位给整数位或者小数位。
那么定点数能够表示的范围和精度的关系如下表所示:
16位符号定点小数表示范围及精度与小数点定标关系
总位宽
整数位宽
小数位宽
范围
精度
16
0
16
[0: 1-2^-16]
2^-16
16
1
15
[0:2-2^-15]
2^-15
16
4
12
[0:16-2^-12]
2^-12
16
6
10
[0:64-2^-10]
2^-10
16
8
8
[0:256-2^-8]
2^-8
16
10
6
[0:1024-2^-6]
2^-6
16
14
2
[0:16384-2^-2]
2^-2
16
16
0
[0:65535]
1
16位有符号定点小数表示范围及精度与小数点定标关系
总位宽
整数位宽
小数位宽
范围
精度
16
1
15
[-1:1-2^-15]
2^-15
16
4
12
[-8:8-2^-12]
2^-12
16
6
10
[-32:32-2^-10]
2^-10
16
8
8
[-128:128-2^-8]
2^-8
16
10
6
[-512:512-2^-6]
2^-6
16
14
2
[-8192:8192-2^-2]
2^-2
16
16
0
[-32768:32767]
1
example1:假设有一个无符号小数1.375,在实际处理的时候我们肯定是希望在担保须要量程的情形下最大精度,固我们可以将该小数的小数点定标在15bit小数,在实际处理中我们常常用u(16,15)来进行表示,个中16表示总位宽,15表示小数位宽,那么1.375的实际定点表示便是:
1.375(float)=1.3752^15=45056(fix)
那么在实际的内存中,该小数便是以45056这样的整数进行存储,经由运算后,如果我们想把它还原成其实际代表的小数,只须要除以2^15就可以,当然详细要除以多少只有程序员自己知道,由于不同的小数定标该整数代表不同的小数。
怎么用定点处理器进行浮点运算?加减法,考虑010010.1(18.5) + 0110.110(6.75),在进行定点加减法之前我们特殊须要把稳的是小数点必须要对齐,然后再进行干系运算,否则运算结果肯定缺点。假设,18.5我们用u(16,10)来表示即6bit表示整数10bit表示小数, 6.75我们用u(16,12)表示即4bit表示整数12bit表示小数,那么其在内存中的实际表示为:
18944 (十进制) ---->0100101000000000(二进制) 小数点在二进制数的这个地方010010.1000000000
27648 (十进制)---->0110110000000000(二进制) 小数点在二进制数的这个地方0110.110000000000
固u(16,10)+u(16,12)相加,首先须要对齐小数位,变成u(18,12)+u(16,12)=u(19,12),固加完后,为了防止溢出,须要用一个19bits的内存来存储结果。
0010010.100000000000
+ 0000110.110000000000
0011001.010000000000
总结如下:对付定点加减法那么一个u(a,b)+u(c+d) 的数相加那么其结果的定点为: u(max(a,c)+1,max(b,d))。
定点乘法:考虑10.11(-1.25)乘以011(3)其结果打算如下:同样考虑这两个数都因此16bit定点表示,且-10.11用s(16,10)表示即6bit整数位宽10bit小数位宽,3用s(16,12)表示即4bit整数位宽,12bit小数位宽,那么其相乘结果为,s(16,10)s(16,12)=s(32,22)。
-10.11在s(16,10)这样的定标下,其在打算机的存储为:
-10353(十进制)---->1101011110001111(二进制)
真实代表的浮点数为:-10353/2^10 = -10.1103515625(由于定点位宽有限故存在定点偏差)
同理,3在s(16,12)这样的定标下,其在打算机的存储为:
12288(十进制)---->0011000000000000(二进制)
真实代表的浮点数为:12288/2^12 = 3
那么其相乘结果定点为s(32,22),在打算机上存储为:
-127217664(十进制)---->11111000011010101101000000000000(二进制)
真实代表的浮点数为:-127217664/2^22 =30.3310546875
总结如下:对付定点乘法s(a,b)s(c,d)=s(a+b,c+d)
总结:上面先容了定点数和浮点数的知识,以及在实际中怎么利用定点运算器去进行浮点运算,从例子我们可以看出利用定点在表示浮点过程中由于位宽显示肯定存在表示偏差,而且在实际运用中,我们看到定点乘法会让结果位宽变大很多,以是在实际中定点算法处理过程中,我们会对中间结果进行饱和或截位处理,饱和截位的方法也有很多,其对结果也有不同的影响,后面章节我们会进行先容。









