用sin和cos的泰勒展开式编程序,求出sin(π/2)、sin(56°)、cos(87°)、cos(π/3),当最后一项的绝对值小于0.00001时,累加结束(求绝对值的函数也可以自定义函数myabs实现)。
实际上,C++的数学库(#include<Cmath>)中已经提供了sin和cos函数,一般解题中我们直接调用即可,而本题要求自定义函数实现,为区别起见,分别起名为mysin和mycos。
提示:程序的输出应该为
- sin(π/2)的值为1
- sin(56°)的值为0.829038
- cos(87°)的值为0.052336
- cos(π/3)的值为0.5
#include <iostream>
using namespace std;
const double pi=3.1415926;
double mysin(double);
double mycos(double);
double myabs(double);
int fact(int);
int main( )
{
cout<<"sin(π/2)的值为"<<mysin(pi/2)<<endl;
cout<<"sin(56°)的值为"<<mysin((56.0/180)*pi)<<endl;
cout<<"cos(87°)的值为"<<mycos((87.0/180)*pi)<<endl;
cout<<"cos(π/3)的值为"<<mycos(pi/3)<<endl;
return 0;
}
//下面定义mysin函数,求sin值
double mysin(double x)
{
int fac,f=1,n=1;
double item,sum=x,x_pow=x;
do
{
fac=fact(2*n+1);
x_pow*=x*x;
f=-f;
item=f*x_pow/fac;
sum+=item;
n+=1;
}
while (myabs(item)>=0.00001);
return sum;
}
//下面定义mycos函数,求cos值
double mycos(double x)
{
int fac,f=1,n=1;
double item,sum=1.0, x_pow=x*x;
do
{
f=-f;
fac=fact(n*2);
item=f*x_pow/fac;
sum+=item;
x_pow*=x*x;
n+=1;
}
while (myabs(item)>=0.00001);
return sum;
}
//下面定义myabs函数,求绝对值
double myabs(double x)
{
return(x>=0?x:-x);
}
//定义fact,求阶乘
int fact(int n)
{
int i,fac=1;
for(i=1;i<=n;i++)
fac=i*fac;
return fac;
}
学习别的写法,不定义阶乘函数
double mysin(double x)
{
double sum=x,x_pow=x,item;
int n=1,fact=1,sign=1; //定义变量时赋初值,已经将第一项考虑到累加和sum中
do
{
fact=fact*(n+1)*(n+2); //fact用于表示阶乘,在公式中作分母
x_pow*=x*x; //x_pow是分子中用于表示阶乘,在公式中作分子
sign=-sign; //确定即将要累加的这一项的符号
item =x_pow/fact*sign; //计算出要累加的项
sum+=item; //将该项累加上去
n+=2;
}while(myabs(item)>1e-5);
return sum;
}
//下面定义mycos函数
double mycos(double x)
{
double sum=1,x_pow=1,item;
int n=0,fact=1,sign=-1;
do
{
fact=fact*(n+1)*(n+2);
x_pow*=x*x;
item =x_pow/fact*sign;
sum+=item;
sign=-sign;
n+=2;
}while(myabs(item)>0.00001);
return sum;
}