前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >sin() 和 cos() 等函数的简单逼近

sin() 和 cos() 等函数的简单逼近

作者头像
caoqi95
发布2019-04-19 09:55:21
2.7K0
发布2019-04-19 09:55:21
举报

Programming 课程布置的作业中要自己实现 sin(),cos(),exp() 等函数。这些函数都可以使用泰勒级数来逼近,如下图所示:

sin() 函数的逼近

由于用泰勒级数实现比较麻烦,需要迭代很多次。又在网上找到了一个简单又快速的实现方法。简单来说就是使用一元二次方程的公式,及一些已知点的值。如下所示:

A+Bx+Cx^2:
A+Bx+Cx^2:
A+B(0)+C0^2 = 0
A+B(0)+C0^2 = 0
A+B(pi/2)+C(pi/2)^2 = 1
A+B(pi/2)+C(pi/2)^2 = 1
A+B(pi)+C(pi)^2 = 0
A+B(pi)+C(pi)^2 = 0

=>

A =0, B=4/pi, C = -4/pi^2
A =0, B=4/pi, C = -4/pi^2

=> if(x>0) {

A =0, B=4/pi, C = -4/pi^2
A =0, B=4/pi, C = -4/pi^2

} => else{

A =0, B=4/pi, C = 4/pi^2
A =0, B=4/pi, C = 4/pi^2

}

逼近的效果还不错,如下所示:

实现代码如下所示:

代码语言:javascript
复制
 float mysin(float x)
 {
    const float B = 1.2732395447; // 4/pi
    const float C = -0.4052847346; // -4/(pi^2)
    float y = 0;
    
    //always wrap input angle to -PI..PI
    if (x < -3.14159265)
        x += 6.28318531;
    else if (x > 3.14159265)
        x -= 6.28318531;
     
    if(x > 0)
        y = B*x + C*x*x;
    else
        y = B*x - C*x*x;
        
    return y; 
    
 }

cos() 函数的逼近

有了 sin() 函数的实现,cos() 的实现就容易多了,毕竟两者之间是有转换公式的:

sin(x+pi/2)=cos(x)
sin(x+pi/2)=cos(x)
cos(x-pi/2)=sin(x)
cos(x-pi/2)=sin(x)

实现代码如下:

代码语言:javascript
复制
float mycos(float x) 
{
    const float Q = 1.5707963268; // pi/2 
    const float PI =3.1415926536;
    x += Q; 

    if(x > PI) 
        x -= 2 * PI; 

    return( mysin(x));
}

exp() 函数的逼近

使用下面的泰勒级数,可以发现当 n = 256 时,逼近的效果会非常好。

逼近结果如下图所示:

实现代码如下:

代码语言:javascript
复制
float myexp(float x)

{
    x = 1.0 + x/256;

    x *= x; x *= x; x *= x; x *= x;

    x *= x; x *= x; x *= x; x *= x;
 
 return x;

}

参考

[1]. [译]一种简单,快速,精准的sin/cos函数模拟,及as3实现 [2]. https://gist.github.com/geraldyeo/988116 [3]. exp()近似计算,exp快速算法,C语言实现exp

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.04.02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • sin() 函数的逼近
  • cos() 函数的逼近
  • exp() 函数的逼近
  • 参考
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档