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

查看: 2448|回复: 8

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

[复制链接]

56

主题

970

回帖

2

蝴蝶豆

金牌会员

最后登录
2020-9-21
发表于 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);
}


回复

使用道具 举报

40

主题

1595

回帖

1

蝴蝶豆

论坛元老

最后登录
2018-7-23
发表于 2015-2-10 23:52:03 | 显示全部楼层
多谢分享!
回复 支持 反对

使用道具 举报

71

主题

1714

回帖

1

蝴蝶豆

论坛元老

最后登录
2020-12-7
发表于 2015-2-11 09:45:56 | 显示全部楼层
这样不一定比用系统函数节省资源吧,有没有一个对比。
回复 支持 反对

使用道具 举报

0

主题

106

回帖

0

蝴蝶豆

中级会员

最后登录
2015-6-16
发表于 2015-2-11 10:25:11 | 显示全部楼层
stm32.jpg
回复 支持 反对

使用道具 举报

0

主题

106

回帖

0

蝴蝶豆

中级会员

最后登录
2015-6-16
发表于 2015-2-11 10:25:29 | 显示全部楼层
hdx.jpg
回复 支持 反对

使用道具 举报

9

主题

646

回帖

24

蝴蝶豆

论坛元老

最后登录
2020-9-4
发表于 2015-2-11 13:28:24 | 显示全部楼层
能达到什么精度?
回复 支持 反对

使用道具 举报

8

主题

98

回帖

0

蝴蝶豆

中级会员

最后登录
2015-10-29
发表于 2015-2-11 13:39:53 | 显示全部楼层
有注释就更好了,
回复 支持 反对

使用道具 举报

2

主题

397

回帖

0

蝴蝶豆

高级会员

最后登录
2016-12-21
发表于 2015-2-11 13:57:28 | 显示全部楼层
能达到什么精度?
回复 支持 反对

使用道具 举报

7

主题

31

回帖

0

蝴蝶豆

初级会员

最后登录
1970-1-1
发表于 2015-2-11 14:27:07 | 显示全部楼层
好东西啊
回复 支持 反对

使用道具 举报

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版