我如何使用CORDIC计算指数以外的数字[- 1,1]



我无法理解计算范围[- 1,1)之外的数字的指数背后的数学(实际上我不确定使用CORDIC计算exp的好范围是什么,有些地方我读[-pi/4, pi/4],而在其他地方我读[- 1,1))使用CORDIC算法。有人能举个例子吗?

我在http://zone.ni.com/reference/en-XX/help/371599G-01/lvfpga/ht_exponential/:上读到下面的语句

"x必须在[- 1,1]范围内。要计算exp(x),当x不在这个范围内时,找到一个整数q和一个实数r,其中r在[0,ln(2)]范围内,使得x = q × ln(2) + r,然后可以计算2^q × exp(r),这相当于exp(x)。因为r在[- 1,1]的有效范围内,你可以使用这个函数来计算exp(r)。"

但是它对我来说没有多大意义,我怎么才能找到q和r?

我发现的第二种方法是在http://www.xilinx.com/support/documentation/application_notes/xapp552-cordic-floating-point-operations.pdf,它告诉我们将数字分成整数和分数部分后使用方程:

cosh(int + frac) = cosh(int) * cosh(frac) + sinh(int) * sinh(frac)
sinh(int + frac) = cosh(int) * sinh(frac) + cosh(frac) * sinh(int)

cosh(int)和sinh(int)取自查找表。但是这种方法计算量更大,所以我更喜欢前面的方法

如果x = q × ln(2) + r then

exp(x) = exp(q × ln(2) + r)
       = exp(ln(2))^q exp(r)
       = 2^q exp(r)

这意味着如果你能找到qr,就很容易找到指数,你只需要位移2 (2<<(q-1))找到exp(r)并将它们乘在一起。

要找到qr,首先注意ln(2)=0.6931471805599453。如果你有除法可用

q =  floor( x / ln(2) )
r = x - q * ln(2)

如果没有除法,可以使用循环

q = 0
while( x > ln(2) ) {
    x -= ln(2)
    ++q
}
r = x

最新更新