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

sin() 函数的逼近
由于用泰勒级数实现比较麻烦,需要迭代很多次。又在网上找到了一个简单又快速的实现方法。简单来说就是使用一元二次方程的公式,及一些已知点的值。如下所示:
=>
=> if(x>0) {}
=> else{}
逼近的效果还不错,如下所示:

实现代码如下所示:
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() 的实现就容易多了,毕竟两者之间是有转换公式的:
实现代码如下:
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
网友评论