你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
MouseCat 提问时间:2015-2-10 23:11 /

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);
}


收藏 评论8 发布时间:2015-2-10 23:11

举报

8个回答
lkl0305 回答时间:2015-2-10 23:52:03
多谢分享!
shaoziyang 回答时间:2015-2-11 09:45:56
这样不一定比用系统函数节省资源吧,有没有一个对比。
kxj116 回答时间:2015-2-11 10:25:11
stm32.jpg
kxj116 回答时间:2015-2-11 10:25:29
hdx.jpg
Mandelbrot_Set 回答时间:2015-2-11 13:28:24
能达到什么精度?
hanmcustm 回答时间:2015-2-11 13:39:53
有注释就更好了,
foxglove 回答时间:2015-2-11 13:57:28
能达到什么精度?
蚂蚁 回答时间:2015-2-11 14:27:07
好东西啊

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版