练习,sin,cos多项式

https://img-blog.csdn.net/20131111153710937

用sin和cos的泰勒展开式编程序,求出sin(π/2)、sin(56°)、cos(87°)、cos(π/3),当最后一项的绝对值小于0.00001时,累加结束(求绝对值的函数也可以自定义函数myabs实现)。

实际上,C++的数学库(#include<Cmath>)中已经提供了sin和cos函数,一般解题中我们直接调用即可,而本题要求自定义函数实现,为区别起见,分别起名为mysin和mycos。
  提示:程序的输出应该为

  1. sin(π/2)的值为1  
  2. sin(56°)的值为0.829038  
  3. cos(87°)的值为0.052336  
  4. 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;  
}  


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值