混合法提高查表法的精度
查表所得结果的精度随表的大小而变化,表越大,则精度越高,但存储量也越大。当系统的存储量有限而精度要求也较高时,查表法就不太适合。那么能否在适当增加运算量的情况下提高非线性运算的精度呢?下面介绍一种查表结合少量运算来计算非线性函数的混合法,这种方法适用于在输入变量的范围内函数呈单调变化的情形。混合法是在查表的基础上来用计算的方法以提高当输入值处于表格两点之间时的精度。提高精度的一个简便方法是采用折线近似法,
设输入值为x,则精确的对数值为y,在表格值的两点之间作一直线,用y'作为y的近似值,则有:
y'=y0+△y
复制代码
其中y0由查表求得。现在只需在查表求得y0的基础上增加△y既可。△y的计算方法如下: △y=(△x/△x0)△y=△x(△y0/△x0)
其中△y0/△x0对每一段来说是一个恒定值,可作一个表格直接查得。此外计算此时需用到每段横坐标的起始值,这个值也可作一个表格。这佯共有三个大小均为10的表格,分别为存储每段起点对数值的表logtab0、存储每段△y0/△x0值的表logtab1和存储每段输入起始值x0的表logtab2,表logtab1和表logtab2可用下列两个数组表示。
int logtab1[10]={22529,20567,18920,17517,16308,
15255,14330,13511,12780,12124};/*△y0/△x0:Q13*/
int logtab2[10]={16384,18022,19660,21299,22938,
24576,26214,27853,29491,31130};/*x0:Q15*/
复制代码
综上所述,采用混合法计算对数值的方法可归纳为:
(1)根据输人值,计算查表地址:index=((x-16384)*20)>>15;
(2)查表得y0=logtab0[index];
(3)计算△x=x-logtab2[index];
(4)计算△y=(△x*logtab1[index])>>13;
(5)计算得结果y=y0+△y。
例1.13已知x=0.54,求log2(x)。
0.54的精确对数值为y=log2(0.54)=-0.889。
混合法求对数值的过程为:
(1)定标Q15,定标值x=0.54*32768=17694;
(2)表地址index=((x-16384)*20)>>15=0;
(3)查表得y0=logtab0[0]=-32768;
(4)计算△x=x-logtab2[0]=17694-16384=1310;
(5)计算△y=(△xlogtab1[0]>>13=(13l0*22529L)>>13=3602
(6)计算结果y=y0+△y=-32768+3602=-29166。
结果y为Q15定标,析算成浮点数为-29166/32768=-0.89,可见精度较高。