首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法完全理解计算指数函数的CORDIC算法

无法完全理解计算指数函数的CORDIC算法
EN

Stack Overflow用户
提问于 2015-11-13 17:19:10
回答 1查看 305关注 0票数 0

我读过一两篇关于CORDIC的论文,但不太明白。不过,我从互联网下载了一个代码,它使用此算法计算指数函数。它非常有用,并帮助我在FPGA上建立了一个函数的指数项。但是现在我正试图写一份报告,我无法解释CORDIC部分是如何工作的,我无法与一般的CORDIC算法联系起来。请先帮我,谢谢你。

代码语言:javascript
复制
function fx = exp_cordic ( x, n )
 a_length = 25;

  a = [ ...
    1.648721270700128, ...
    1.284025416687742, ...
    1.133148453066826, ...
    1.064494458917859, ...
    1.031743407499103, ...
    1.015747708586686, ...
    1.007843097206488, ...
    1.003913889338348, ...
    1.001955033591003, ...
    1.000977039492417, ...
    1.000488400478694, ...
    1.000244170429748, ...
    1.000122077763384, ...
    1.000061037018933, ...
    1.000030518043791, ...
    1.0000152589054785, ...
    1.0000076294236351, ...
    1.0000038147045416, ...
    1.0000019073504518, ...
    1.0000009536747712, ...
    1.0000004768372719, ...
    1.0000002384186075, ...
    1.0000001192092967, ...
    1.0000000596046466, ...
    1.0000000298023228 ];
  e = 2.718281828459045;

  x_int = floor ( x );
%
%  Determine the weights.
%
  poweroftwo = 0.5;
  z = x - x_int;

  for i = 1 : n
    w(i) = 0.0;
    if ( poweroftwo < z )
      w(i) = 1.0;
      z = z - poweroftwo;
    end
    poweroftwo = poweroftwo / 2.0;
  end
%
%  Calculate products.
%
  fx = 1.0;

  for i = 1 : n

    if ( i <= a_length )
      ai = a(i);
    else
      ai = 1.0 + ( ai - 1.0 ) / 2.0;
    end

    if ( 0.0 < w(i) )
      fx = fx * ai;
    end

  end
%
%  Perform residual multiplication.
%
  fx = fx             ...
    * ( 1.0 + z       ...
    * ( 1.0 + z / 2.0 ...
    * ( 1.0 + z / 3.0 ...
    * ( 1.0 + z / 4.0 ))));
%
%  Account for factor EXP(X_INT).
%
  if ( x_int < 0 )

    for i = 1 : -x_int
      fx = fx / e;
    end

  else

    for i = 1 : x_int
      fx = fx * e;
    end

  end

  return
end

我做了一些修改,删除了一些代码,并试图使它更简单,它的工作,我不知道我做了什么,为什么它仍然工作!

代码语言:javascript
复制
a = [ ...
    1.648721270700128, ...
    1.284025416687742, ...
    1.133148453066826, ...
    1.064494458917859, ...
    1.031743407499103, ...
 ];


  e = 2.718281828459045;

  x_int = floor ( x );
  z = x - x_int;
  fx = 1.0;
  for i = 1 : n
    if ( 2^(-i) < z )
     z=z-2^(-i);
      fx = fx * a(i); 
    end
  end

  if ( x_int < 0 )
    for i = 1 : -x_int
      fx = fx / e;
    end
  else

    for i = 1 : x_int
      fx = fx * e;
    end
  end

  return
end
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-14 15:55:07

这使用了众所周知的事实

代码语言:javascript
复制
exp(x+y)=exp(x)*exp(y) and a^(x*y)=(a^x)^y.

首先将输入数字x分解为整数部分和分数部分x = x_int + z。任何整数幂算法都可以很容易地计算x_int的指数,所提出的算法是次优的。

因子表是分数部分的二进制表示形式。

代码语言:javascript
复制
z = z[1]/2+z[2]/4+z[3]/8+…

其中z[i]要么是0要么是1。然后,第一个循环计算

代码语言:javascript
复制
exp(1/2)^z[1] * exp(1/4)^z[2] * exp(1/8)^z[3]*…

其中第二个指数是读为

代码语言:javascript
复制
(z[i]==1) ? exp(1/2^i) : 1 

也就是说,只有z[i]==1的因素实际存在于产品中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33698358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档