- UID
- 872238
|
二 整数乘整数 例1.10 Q0*Q0=Q0 17*(-5)=-85 0000000000010001=l7 *1111111111111011=-5-------------------------------------------11111111111111111111111110101011=-85 3. 混合表示法 许多情况下,运算过程中为了既满足数值的动态范围又保证一定的精度,就必须采用Q0与Q15之间的表示法。比如,数值1.2345,显然Q15无法表示,而若用Q0表示,则最接近的数是1,精度无法保证。因此,数1.2345最佳的表示法是Q14。 例1.11 1.5*0.75= 1.125 01.10000000000000=1.5;Q14 *00.11000000000000=0.75;Q14 --------------------------------------- 0001.0010000000000000000000000000=1.125 Q28 Q14的最大值不大于2,因此,两个Q14数相乘得到的乘积不大于4。 一般地,若一个数的整数位为i位,小数位为j位,另一个数的整数位为m位,小数位为n位,则这两个数的乘积为(i+m)位整数位和(j+n)位小数位。这个乘积的最高16位可能的精度为(i+m)整数位和(15- i- m)小数位。 但是,若事先了解数的动态范围,就可以增加数的精度。例如,程序员了解到上述乘积不会大于1.8,就可以用Q14数表示乘积,而不是理论上的最佳情况Q13。例3.11的TMS320C25程序如下: LT OP1;OP1 = 6000H(1.5/Ql4) MPY OP2;OP2 = 3000H(0.75/Q14) PAC SACH ANS,1;ANS=2400H(1.125/Q13) 上述方法,为了精度均对乘的结果舍位,结果所产生的误差相当于减去一个LSB(最低位)。采用下面简单的舍人方法,可使误差减少二分之一。 LT OP1 MPY OP2 PAC ADD ONE,14(上舍入) SACH ANS,1 上述程序说明,不管ANS为正或负,所产生的误差是l/2 LSB,其中存储单元ONE的值为1。 3.2定点加法 乘的过程中,程序员可不考虑溢出而只需调整运算中的小数点。而加法则是一个更加复杂的过程。首先,加法运算必须用相同的Q点表示,其次,程序员或者允许其结果有足够的高位以适应位的增长,或者必须准备解决溢出问题。如果操作数仅为16位长,其结果可用双精度数表示。下面举例说明16位数相加的两种途径。 1.保留32位结果 LAC OP1;(Q15) ADD OP2;(Ql5) SACH ANSHI ;(高16位结果) SACL ANSLO :(低16位结果) 2.调整小数点保留16位结果 LAC OP1,15;(Q14数用ACCH表示) ADD OP2,15;(Q14数用ACCH表示) SACH ANS;(Q14) 加法运算最可能出现的问题是运算结果溢出。TMS320提供了检查溢出的专用指令BV,此外,使用溢出保护功能可使累加结果溢出时累加器饱和为最大的整数或负数。当然,即使如此,运算精度还是大大降低。因此,最好的方法是完全理解基本的物理过程并注意选择数的表达方式。 3.3定点除法 在通用DSP芯片中,一般不提供单周期的除法指令,为此必须采用除法子程序来实现。二进制除法是乘法的逆运算。乘法包括一系列的移位和加法,而除法可分解为一系列的减法和移位。下面我们来说明除法的实现过程。 设累加器为8位,且除法运算为10除以3。除的过程包括与被除法有关的除数逐步移位,在每一步进行减法运算,如果能减则将位插入商中。 (1)除数的最低有效位对齐被除数的最高有效位。 0000l0l0 - 00011000 -------------------------------------- 11110010 (2)由于减法结果为负,放弃减法结果,将被除数左移一位,再减。 00010100 - 00011000 ---------------------------------------- 11111000 (3)结果仍为负,放弃减法结果,被除数左移一位,再减。 00101000 - 00011000 ------------------------------------------ 00010000 (4)结果为正,将减法结果左移一位后加1,作最后一次减。 00100001 - 00011000 ---------------------------------------- 00001001 (5)结果为正,将结果左移一位加1 得最后结果。高4位代表余数,低4位表示商。 00010011 即,商为0011= |
|