求C语言大神,利用泰勒公式计算sin(x)的值,要求输入x(弧度值),当精度小于10的负5次方时程

求C语言大神,利用泰勒公式计算sin(x)的值,要求输入x(弧度值),当精度小于10的负5次方时程序停止执行。... 求C语言大神,利用泰勒公式计算sin(x)的值,要求输入x(弧度值),当精度小于10的负5次方时程序停止执行。 展开
 我来答
灵长目1990
2015-10-17 · TA获得超过2716个赞
知道小有建树答主
回答量:956
采纳率:50%
帮助的人:926万
展开全部

  您好,这个题其实不难,控制好溢出套用泰勒展开式就好:

  C语言程序如下,VC++6中测试通过:

#include <stdio.h>
#include <math.h>

#define PI 3.1415926                /*定义π的值*/

unsigned long fac(unsigned long n)  /*计算阶乘*/
{
  unsigned long i, m;
  
  for(i=0,m=1; i<=n; i++)
  {
    if(i!=0)                        /*0的阶乘为1*/
      m = m * i;
  }

  return m;
}

double fsin(double x)               /*计算sin(x)*/
{
  double tmp, t;                    /*tmp存储每次计算完的值*/
  int i;                            /*t代表泰勒展开式每一项*/

  while(x>=2*PI)                       /*最多只有2π个弧度*/
    x = x - 2*PI;                   /*弧度范围转换*/
  
  for(i=1,tmp=0.0; i<=6; i++)       /*防止溢出*/
  {                                 //设置i=6的原因是在VC6中13的阶乘会溢出
    t = pow(x, 2*i-1)/fac(2*i-1);   /*x^n/n!,n为从1开始的奇数*/

    if(t>=0.00001)                  /*控制精度不小于10的-5次方*/
      tmp = tmp + pow(-1, i-1)*t;   /*确定各项的正负*/
    else
      break;
  }
  
    return tmp;
}

int main()
{
  double r, tmp;
  
  printf("输入弧度值(>=0),180°对应3.1415926弧度,以此类推...\n");
  printf("弧度(rad):");
  
  scanf("%lf", &r);

  tmp = fsin(r);
  
  printf("%.5lf\n", tmp);
}

  假如要测试sin(30°),由于30°=π/6=0.523599rad,故测试时需要输入:0.523599:

            


  这个题关键是控制好溢出,比如当i=7时,2*i-1=13,而13的阶乘是个很大的数字,(在VC6中)已经超出了无符号长整型的范围,所以i最多只能循环到6.


  您的采纳是我们的动力(⊙v⊙)

更多追问追答
追问
看不懂,好复杂,这是用循环语句吗

荒漠小野猪U9
2015-10-17 · TA获得超过216个赞
知道答主
回答量:710
采纳率:0%
帮助的人:115万
展开全部
什么鬼?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式