MouseCat 发表于 2015-2-10 23:11:47

三角函数近似计算(正余弦泰勒展开)


PS: C编译环境下的数学函数是怎么实现的?


/**
* 输入角度范围为 -PI/2 到 PI/2.
* 需要5次乘法和3次加法.
*/
float _sinf(float x) {
   float x2 = x * x;
   return ( x *(1.0f -
            x2 * ((1.0f / 6) -
            x2 * ((1.0f / 120) -
            x2 *(1.0f / 5203)))));                            // 5040, 5203 可获得较高的精度.
   // return ( x *(1.0f -
            // x2 * ((1.0f / 6) -
            // x2 * ((1.0f / 120) -
            // x2 * ((1.0f / 5040) -
            // x2 *(1.0f / 362880))))));                         // 增加一级.
}

/**
*输入角度范围为 -PI/2 到 PI/2.
* 需要5次乘法和4次加法.
*/
float _cosf(float x) {
   float x2 = x * x;
   return (1.0f -
             x2 * ((1.0f / 2) -
            x2 * ((1.0f / 24) -
            x2 * ((1.0f / 720) -
            x2 *(1.0f / 41367)))));                           // 40320, 41367 可获得较高的精度.
   // return (1.0f -
            // x2 * ((1.0f / 2) -
            // x2 * ((1.0f / 24) -
            // x2 * ((1.0f / 720) -
            // x2 * ((1.0f / 40320) -
            // x2 *(1.0f / 3628800))))));                        // 增加一级.
}

/**
* 返回角度范围为 -PI 到 PI.
*/
float _atan2f(float y, float x) {
   uint8_t sx, sy;
   if(y == 0) {
         if (x >= 0) return (0);
         else      return (-PI);
   }
   if(x == 0) {
         if(y >= 0)return( PI / 2);
         else      return(-PI / 2);
   }
   
   sx = sy = 0;
   if (x < 0) {
         x = -x;
         sx = 1;
   }
   if (y < 0) {
         y = -y;
         sy = 1;
   }
   
   if (x == y) {
         y = PI / 4;
   } else {
         uint8_t mode;
         if (x > y) {
             y = y / x;
             mode = 0;
         } else {
             y = x / y;
             mode = 1;
         }
         x = y * y;
         y *= 1.0f -
             x * (0.333332062f -         // 这几个数能获得较高的精度
             x * (0.199462891f -
             x * 0.083332539f));
         if (mode != 0) {
             y = (PI / 2) - y;
         }
   }
   
   if(sx != 0) y = PI - y;
   if(sy != 0) y = -y;
   
   return (y);
}


lkl0305 发表于 2015-2-10 23:52:03

多谢分享!

shaoziyang 发表于 2015-2-11 09:45:56

这样不一定比用系统函数节省资源吧,有没有一个对比。

kxj116 发表于 2015-2-11 10:25:11

kxj116 发表于 2015-2-11 10:25:29

Mandelbrot_Set 发表于 2015-2-11 13:28:24

能达到什么精度?:o

hanmcustm 发表于 2015-2-11 13:39:53

有注释就更好了,

foxglove 发表于 2015-2-11 13:57:28

能达到什么精度?

蚂蚁 发表于 2015-2-11 14:27:07

好东西啊
页: [1]
查看完整版本: 三角函数近似计算(正余弦泰勒展开)