2010-09-08 09:14:27|  分类: 默认分类 |  标签: |字号大中小 订阅

#define REAL   float
#define TAN_MAP_RES     0.003921569     /* (smallest non-zero value in table) */
#define RAD_PER_DEG     0.017453293
#define TAN_MAP_SIZE    256
#define MY_PPPIII   3.14159
#define MY_PPPIII_HALF   1.570796

float fast_atan_table[257] = {
  0.000000e+00, 3.921549e-03, 7.842976e-03, 1.176416e-02,
  1.568499e-02, 1.960533e-02, 2.352507e-02, 2.744409e-02,
  3.136226e-02, 3.527947e-02, 3.919560e-02, 4.311053e-02,
  4.702413e-02, 5.093629e-02, 5.484690e-02, 5.875582e-02,
  6.266295e-02, 6.656816e-02, 7.047134e-02, 7.437238e-02,
  7.827114e-02, 8.216752e-02, 8.606141e-02, 8.995267e-02,
  9.384121e-02, 9.772691e-02, 1.016096e-01, 1.054893e-01,
  1.093658e-01, 1.132390e-01, 1.171087e-01, 1.209750e-01,
  1.248376e-01, 1.286965e-01, 1.325515e-01, 1.364026e-01,
  1.402496e-01, 1.440924e-01, 1.479310e-01, 1.517652e-01,
  1.555948e-01, 1.594199e-01, 1.632403e-01, 1.670559e-01,
  1.708665e-01, 1.746722e-01, 1.784728e-01, 1.822681e-01,
  1.860582e-01, 1.898428e-01, 1.936220e-01, 1.973956e-01,
  2.011634e-01, 2.049255e-01, 2.086818e-01, 2.124320e-01,
  2.161762e-01, 2.199143e-01, 2.236461e-01, 2.273716e-01,
  2.310907e-01, 2.348033e-01, 2.385093e-01, 2.422086e-01,
  2.459012e-01, 2.495869e-01, 2.532658e-01, 2.569376e-01,
  2.606024e-01, 2.642600e-01, 2.679104e-01, 2.715535e-01,
  2.751892e-01, 2.788175e-01, 2.824383e-01, 2.860514e-01,
  2.896569e-01, 2.932547e-01, 2.968447e-01, 3.004268e-01,
  3.040009e-01, 3.075671e-01, 3.111252e-01, 3.146752e-01,
  3.182170e-01, 3.217506e-01, 3.252758e-01, 3.287927e-01,
  3.323012e-01, 3.358012e-01, 3.392926e-01, 3.427755e-01,
  3.462497e-01, 3.497153e-01, 3.531721e-01, 3.566201e-01,
  3.600593e-01, 3.634896e-01, 3.669110e-01, 3.703234e-01,
  3.737268e-01, 3.771211e-01, 3.805064e-01, 3.838825e-01,
  3.872494e-01, 3.906070e-01, 3.939555e-01, 3.972946e-01,
  4.006244e-01, 4.039448e-01, 4.072558e-01, 4.105574e-01,
  4.138496e-01, 4.171322e-01, 4.204054e-01, 4.236689e-01,
  4.269229e-01, 4.301673e-01, 4.334021e-01, 4.366272e-01,
  4.398426e-01, 4.430483e-01, 4.462443e-01, 4.494306e-01,
  4.526070e-01, 4.557738e-01, 4.589307e-01, 4.620778e-01,
  4.652150e-01, 4.683424e-01, 4.714600e-01, 4.745676e-01,
  4.776654e-01, 4.807532e-01, 4.838312e-01, 4.868992e-01,
  4.899573e-01, 4.930055e-01, 4.960437e-01, 4.990719e-01,
  5.020902e-01, 5.050985e-01, 5.080968e-01, 5.110852e-01,
  5.140636e-01, 5.170320e-01, 5.199904e-01, 5.229388e-01,
  5.258772e-01, 5.288056e-01, 5.317241e-01, 5.346325e-01,
  5.375310e-01, 5.404195e-01, 5.432980e-01, 5.461666e-01,
  5.490251e-01, 5.518738e-01, 5.547124e-01, 5.575411e-01,
  5.603599e-01, 5.631687e-01, 5.659676e-01, 5.687566e-01,
  5.715357e-01, 5.743048e-01, 5.770641e-01, 5.798135e-01,
  5.825531e-01, 5.852828e-01, 5.880026e-01, 5.907126e-01,
  5.934128e-01, 5.961032e-01, 5.987839e-01, 6.014547e-01,
  6.041158e-01, 6.067672e-01, 6.094088e-01, 6.120407e-01,
  6.146630e-01, 6.172755e-01, 6.198784e-01, 6.224717e-01,
  6.250554e-01, 6.276294e-01, 6.301939e-01, 6.327488e-01,
  6.352942e-01, 6.378301e-01, 6.403565e-01, 6.428734e-01,
  6.453808e-01, 6.478788e-01, 6.503674e-01, 6.528466e-01,
  6.553165e-01, 6.577770e-01, 6.602282e-01, 6.626701e-01,
  6.651027e-01, 6.675261e-01, 6.699402e-01, 6.723452e-01,
  6.747409e-01, 6.771276e-01, 6.795051e-01, 6.818735e-01,
  6.842328e-01, 6.865831e-01, 6.889244e-01, 6.912567e-01,
  6.935800e-01, 6.958943e-01, 6.981998e-01, 7.004964e-01,
  7.027841e-01, 7.050630e-01, 7.073330e-01, 7.095943e-01,
  7.118469e-01, 7.140907e-01, 7.163258e-01, 7.185523e-01,
  7.207701e-01, 7.229794e-01, 7.251800e-01, 7.273721e-01,
  7.295557e-01, 7.317307e-01, 7.338974e-01, 7.360555e-01,
  7.382053e-01, 7.403467e-01, 7.424797e-01, 7.446045e-01,
  7.467209e-01, 7.488291e-01, 7.509291e-01, 7.530208e-01,
  7.551044e-01, 7.571798e-01, 7.592472e-01, 7.613064e-01,
  7.633576e-01, 7.654008e-01, 7.674360e-01, 7.694633e-01,
  7.714826e-01, 7.734940e-01, 7.754975e-01, 7.774932e-01,
  7.794811e-01, 7.814612e-01, 7.834335e-01, 7.853983e-01,
  7.853983e-01
};

float my_abs(float f)
{
    if (f >= 0.0)
    {
        return f;
    }

return -f;
}

REAL fast_atan2(REAL y, REAL x) {
  REAL x_abs, y_abs, z;
  REAL alpha, angle, base_angle;
  int index;

/* don't divide by zero! */
  if ((y == 0.0) && (x == 0.0))
    angle = 0.0;
  else {
    /* normalize to +/- 45 degree range */
    y_abs = my_abs(y);
    x_abs = my_abs(x);
    //z = (y_abs < x_abs ? y_abs / x_abs : x_abs / y_abs);
    if (y_abs < x_abs)
      z = y_abs / x_abs;
    else
      z = x_abs / y_abs;
    /* when ratio approaches the table resolution, the angle is */
    /*      best approximated with the argument itself...       */
    if (z < TAN_MAP_RES)
      base_angle = z;
    else {
      /* find index and interpolation value */
      alpha = z * (REAL) TAN_MAP_SIZE - .5;
      index = (int) alpha;
      alpha -= (REAL) index;
      /* determine base angle based on quadrant and */
      /* add or subtract table value from base angle based on quadrant */
      base_angle = fast_atan_table[index];
      base_angle +=
        (fast_atan_table[index + 1] - fast_atan_table[index]) * alpha;
    }

if (x_abs > y_abs) {        /* -45 -> 45 or 135 -> 225 */
      if (x >= 0.0) {           /* -45 -> 45 */
        if (y >= 0.0)
          angle = base_angle;   /* 0 -> 45, angle OK */
        else
          angle = -base_angle;  /* -45 -> 0, angle = -angle */
      } else {                  /* 135 -> 180 or 180 -> -135 */
        angle = 3.14159265358979323846;
        if (y >= 0.0)
          angle -= base_angle;  /* 135 -> 180, angle = 180 - angle */
        else
          angle = base_angle - angle;   /* 180 -> -135, angle = angle - 180 */
      }
    } else {                    /* 45 -> 135 or -135 -> -45 */
      if (y >= 0.0) {           /* 45 -> 135 */
        angle = 1.57079632679489661923;
        if (x >= 0.0)
          angle -= base_angle;  /* 45 -> 90, angle = 90 - angle */
        else
          angle += base_angle;  /* 90 -> 135, angle = 90 + angle */
      } else {                  /* -135 -> -45 */
        angle = -1.57079632679489661923;
        if (x >= 0.0)
          angle += base_angle;  /* -90 -> -45, angle = -90 + angle */
        else
          angle -= base_angle;  /* -135 -> -90, angle = -90 - angle */
      }
    }
  }
#ifdef ZERO_TO_TWOPI
  if (angle < 0)
    return (angle + TWOPI);
  else
    return (angle);
#else
  return (angle);
#endif
}

float my_atan(float x, float y)
{
    return fast_atan2(y, x);
}

float my_pow(float a)
{
    return a*a;
}

float my_sqrt(float number)
{
    long i;
    float x, y;
    const float f = 1.5F;
    x = number * 0.5F;
    y = number;
    i = * ( long * ) &y;
    i = 0x5f3759df - ( i >> 1 );

y = * ( float * ) &i;
    y = y * ( f - ( x * y * y ) );
    y = y * ( f - ( x * y * y ) );
    return number * y;
}

#define ONE_PI   (3.14159265)
#define TWO_PI   (2.0 * 3.14159265)
#define ANGLE_UNIT (TWO_PI/10.0)

double mx_sin(double rad)
{   
    double sine;
    if (rad < 0)
        sine = rad*(1.27323954 + 0.405284735 * rad);
    else
        sine = rad * (1.27323954 - 0.405284735 * rad);
    if (sine < 0)
        sine = sine*(-0.225 * (sine + 1) + 1);
    else
        sine = sine * (0.225 *( sine - 1) + 1);
    return sine;
}

double my_sin(double rad)
{
    char flag = 1;
    if (rad >= ONE_PI)
    {
        rad -= ONE_PI;
        flag = -1;
    }
    return mx_sin(rad) * flag;
}
float my_cos(double rad)
{
    char flag = 1;
    rad += ONE_PI/2.0;

if (rad >= ONE_PI)
    {
        flag = -1;
        rad -= ONE_PI;
    }

return my_sin(rad)*flag;
}

  评论这张
转发至微博
转发至微博
0人  |  分享到:          
阅读(295) | 评论(1) | 引用 (0) | 举报

三角函数快速算法(反正切,正余弦,开平方)相关推荐

  1. 智能优化算法:正余弦优化算法-附代码

    智能优化算法:正余弦优化算法-附代码 文章目录 智能优化算法:正余弦优化算法-附代码 1.算法原理 2.算法流程 3.算法结果 4.参考文献 5.MATLAB代码 6.Python代码 摘要:正 余 ...

  2. c语言计算特殊角的正弦值,特殊角的三角函数值表 常用的正余弦函数值

    特殊三角函数值一般指在特定角下的正余弦值,这些角度的三角函数值是经常用到的.下面小编整理了特殊角的三角函数值表,供大家参考! 三角函数值表 三角函数相关公式 1.数关系 tanα·cotα=1 sin ...

  3. 正余弦函数的matlab仿真,实现正余弦信号的算法比较

    实现正余弦函数的几种算法记录 1.几种算法的理论推导与matlab仿真 (1)Taylor级数逼近正余弦函数的推导 精度要求为20bit,其对应误差为9.536e-7,所以泰勒函数逼近的误差值要小于9 ...

  4. cordic ip核 vivado_vivado中Cordic IP核使用——计算正余弦(sin/cos)

    目录 1.Cordic算法介绍 2.Cordic IP核介绍 3.仿真 4.存在的问题 5.参考 1.Cordic算法介绍 cordic算法将正余弦计算转换为简单的迭代过程(一系列的加减和移位操作), ...

  5. vivado中Cordic IP核使用——计算正余弦(sin/cos)

    目录 1.Cordic算法介绍 2.Cordic IP核介绍 3.仿真 4.存在的问题 5.参考 1.Cordic算法介绍 cordic算法将正余弦计算转换为简单的迭代过程(一系列的加减和移位操作), ...

  6. 2---理解正余弦、复数求模、反正切和乘除运算的CORDIC算法实现

    CORDIC(Coordinate Rotation Digital Computer)算法是J.Volder在1956在航空控制系统设计中构思的,但其实相似的算法在更早的1624年就已经被Henry ...

  7. C语言正余弦函数定点查表算法原理及实现

    如果用数学库中的sin和cos函数计算,可能涉及浮点.乘法.除法运算,运行速率较低.这里介绍一种正余弦查表算法. 参考代码:SMT32 FOC电机库的mc_math.c. 首先我们知道正弦和余弦的函数 ...

  8. 基于混沌的正余弦鲸鱼优化算法-附代码

    基于混沌的正余弦鲸鱼优化算法 文章目录 基于混沌的正余弦鲸鱼优化算法 1.鲸鱼优化算法 2. 改进鲸鱼优化算法 2.1 混沌初始化种群和参数优化 2.2 正余弦鲸鱼优化算法 2.3 混沌自适应的惯性权 ...

  9. c语言快速平方根算法,单片机开平方的快速算法

    原标题:单片机开平方的快速算法 吴鉴鹰单片机开发板地址 店铺:[吴鉴鹰的小铺] 地址:[https://item.taobao.com/item.htm?_u=ukgdp5a7629&id=5 ...

最新文章

  1. 集合框架源码分析——抽象类
  2. 机器学习知识点(一)文本字符信息熵Java实现
  3. STM32F105的时钟配置
  4. word文档怎么限制编辑(禁止编辑、只读)?
  5. jdk紧急漏洞,XMLDecoder反序列化攻击
  6. datagridview 当前上下文中不存在bind_全面解析JavaScript中this指向问题
  7. MySQL 性能分析 之 联合索引(复合索引)实践分析
  8. 004:2的幂次方表示
  9. 查linux服务器CPU多少C,在linux 下怎么查看服务器的cpu和内存的硬件信息
  10. STL 关联容器的lower_bound()和upper_bound()
  11. Atitit uri url格式规范与解析器 .URIparser 理解URI和URL的区别,我们引入URN这个概念。 URI = Universal Resource Identifier 统一资
  12. 基于Spark的电影推荐系统实现
  13. 行情数据接口-美股版
  14. webservice框架jersey简单总结
  15. 如何获取联盟后台的s.click.taobao.com的短链接
  16. libcurl 使用方法简介
  17. PS画虚线的几种方法
  18. Vultr与阿里云结合自动换IP的解决方案
  19. Ubuntu使用cmake出现Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed
  20. 当你焦虑时,请读《走在自己的时区里》这首诗

热门文章

  1. 生死簿后台管理系统(有趣、放松下大脑)
  2. 空调市场“三连降”背后,经销商们早已退无可退
  3. Java线上兼职家教_基于jsp的家教兼职网站-JavaEE实现家教兼职网站 - java项目源码...
  4. 2022年中国电力数字化产业研究报告 附下载
  5. 服务器主板主要组成部分
  6. 编译开源有限元软件calculix
  7. 害死人不偿命的(3n+1)猜想
  8. linux查找缺少的命令
  9. 关于坦克大战的简单移动以及子弹发射
  10. 专家说法:安防与隐私之间如何权衡?