如何使用CORDIC为[-1,1]之外的数字计算指数?

时间:2015-09-05 02:47:57

标签: verilog hdl cordic

我无法理解计算超出范围[-1,1]的数字的指数的数学(实际上我不确定使用CORDIC计算exp的好范围,我阅读的某个地方[-pi] / 4,pi / 4]以及其他我使用CORDIC算法读过[-1,1))。有人能举个例子吗?

我在http://zone.ni.com/reference/en-XX/help/371599G-01/lvfpga/ht_exponential/阅读以下声明:

“x必须在[-1,1]范围内。当x超出此范围时计算exp(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)取自查找表。但是这种方法计算量更大,所以我更喜欢前一种方法。

1 个答案:

答案 0 :(得分:1)

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

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