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

查看: 2472|回复: 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版