2015-09-05 86 views
0

我无法理解在计算范围[-1,1)之外的数字指数后面的数学(实际上,我不确定使用CORDIC计算exp的好范围,我读过的一些地方[-pi/4,pi/4],而在另外一些中,我已经阅读[-1,1))使用CORDIC算法。有人可以举个例子吗?如何使用CORDIC计算[-1,1]以外的数字的指数?

我阅读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)和双曲正弦(INT)从查找表会被执行。但是这种方法计算量更大,所以我更喜欢前一个。

+0

这可能是在[数学堆栈Exchange站点]更适合(https://开头的数学.stackexchange.com /) –

+0

是的,但我找不到像Verilog,HDL和CORDIC这样的标签,这使得很难找到合适的人。 – user3575732

回答

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