美文网首页
sin() 和 cos() 等函数的简单逼近

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

作者: 捡个七 | 来源:发表于2019-04-02 21:50 被阅读0次

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

sin() 函数的逼近

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

A+Bx+Cx^2:

  • A+B(0)+C0^2 = 0
  • A+B(pi/2)+C(pi/2)^2 = 1
  • A+B(pi)+C(pi)^2 = 0

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

=> if(x>0) {A =0, B=4/pi, C = -4/pi^2}
=> else{A =0, B=4/pi, C = 4/pi^2}

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

实现代码如下所示:

 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)
cos(x-pi/2)=sin(x)

实现代码如下:

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 时,逼近的效果会非常好。

逼近结果如下图所示:

实现代码如下:

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

相关文章

网友评论

      本文标题:sin() 和 cos() 等函数的简单逼近

      本文链接:https://www.haomeiwen.com/subject/bhgbbqtx.html