迭代法求倒数
先推导一下求倒数迭代公式,
1/y ~= x,~=表示约等于
1/(y+dy) = x,Y=y+dy,dy为一个很小的数
1/(y+dy) = (y-dy)/(y*y – dy*dy)
= (y-dy)/(y*y)
= (2*y-Y)/(y*y)
因为dy*dy很小,忽略不计
(y+dy)*x = x*y*y/(2*y-Y) = 1
x*y*y = 2*y-Y
Y=2*y-x*y*y = y*(2-x*y)
若求2*x的倒数,那么就变成了Y=2*y*(1-x*y) (1)
假设x在0.5-1之间,2*x在1-2之间,倒数Y就在0.5-1之间。对于任何整数X,先将其转换为0.5-1之间的数x,然后再按照公式求倒数。
假设 X = x*2^n,用x按照公式求得的倒数为Y,那么实际的倒数为Y/2^(n-1)。例如求3的倒数,3=0.75*4,把0.75转换为Q15的定点小数 0×6000,代入公式(1)运算得0×5554,那么实际的倒数就是0×5554/2 = 0×2AAA为0.3333的Q15定点小数。
迭代的初值可以由线性方程求得,2*x = 1 时Y=1,2*x=2时Y=0.5,则初值Y0 = 1.5 – x,用Q15小数表示则为,Y0 = 0×8000 – x + 0×4000
至于如何将整数X转换为x*2^n,则需要DSP的特殊的Normalization命令了。例如C54x里面就有EXP和NORM两个汇编指令来完成这样的任务。详细使用方法请参考相应的汇编指令手册。
def mult_q31(x, y):
return x*y/0×8000
def recp_q31(x):
y = 0×8000 - x
y = y + 0×4000
ny = 0
while 1:
ny = 2*mult_q31(y, 0×7fff - mult_q31(x,y))
print ny
if ny == y:
return ny
else:
y = ny
print recp_q31(0×6000)
相关日志
If you enjoyed this post, please consider to leave a comment or subscribe to the feed and get future articles delivered to your feed reader.
