用c语言求cos(x)的近似值

输入精度 e 和 x,Cos(x) = x^0/0!-x^2/2!+x^4/4!-x^6/6!+……要求精确到最后一项的绝对值小于e,为什么下面的程序错误了呀,谢谢各位了
#include "stdio.h"
#include "math.h"
int fact(int x)
{
int s=1;
int i;
for(i=1;i<=x;i++)
s=s*i;
return s;
}

double funcos(double e, double x);
int main(void)
{

double e, sum, x;
scanf("%le%le", &e, &x);
sum=funcos(e,x);
printf("sum = %f\n", sum);
return 0;
}

double funcos(double e, double x)
{
double s=1;
double item;
int i=2;
int j=1;
item=(double)pow(x,i)/fact(i);
while(item>e)
{
if(j%2==1)
s=s-item;
else
s=s+item;
i=i+2;
j++;
item=(double)pow(x,i)/fact(i);
}
if(j%2==1)
s=s-item;
else
s=s+item;
return s;

}

我用VS2010,没错啊

// Cos.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include "stdio.h"

#include "math.h"

int fact(int x)

{

 int s=1;

 int i;

 for(i=1;i<=x;i++)

 s=s*i;

 return s;

}

 

double funcos(double e, double x);

int _tmain(int argc, _TCHAR* argv[])

{

 double e, sum, x;

    scanf("%le%le", &e, &x);

    sum=funcos(e,x);

    printf("sum = %f\n", sum);

 return 0;

}

double funcos(double e, double x)

{

 double s=1;

 double item;

 int i=2;

 int j=1;

 item=(double)pow(x,i)/fact(i);

 while(item>e)

 {

  if(j%2==1)

  s=s-item;

  else

  s=s+item;

  i=i+2;

  j++;

  item=(double)pow(x,i)/fact(i);

 }

     if(j%2==1)

  s=s-item;

  else

  s=s+item;

 return s;

 

}

追问

如果输入o.0001 3.14 就错了呀

追答

没错

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-31
开始处。修改后结果正确,程序如下:

#include "stdio.h"
#include "math.h"
double funcos(double e, double x);
int main(void)
{
int repeat, ri;
double e, sum, x;

scanf("%d", &repeat);
for(ri = 1; ri <= repeat; ri++){
scanf("%le%le", &e, &x);
sum=funcos(e,x);
printf("sum = %f\n", sum);
}
}
double funcos(double e,double x)
{
int i,d,flag;
double item,b,di;
d=0;
flag=1;
b=0.0;
do{
di=1.0;
for(i=1;i<=d;i++){
di=di*i;
}
item=flag*pow(x,d)/di;
b=b+item;
flag=-flag;
d+=2;
} while(fabs(item)>=e);

return b;
}
第2个回答  2011-03-31
你的程序没有注释,这是编程的大忌,让人无从测试
我没有认真看过你的程序,我很 仓促的写了下我的程序,虽然有很很多漏洞,但也许可以帮助你理解这种求近似值的算法
#include <stdio.h>
#include <math.h>
long jiecheng(int x);//递归求阶乘

main()
{
double x;
double e;//固定误差
double c=0;//cos(x)的近似求和值
double d;//近似值和sin函数求到的值的差
int n;
n=0;
s=0;
printf("依次输入x和误差e\n");
scanf("%lf%lf",&x,&e);
d=c-cos(x);
if(d<0)d=-d;
while(d-e>0){//当监测的动态误差小于固定误差时,循环继续
if(n==0)c+=1;//第一项c=1
else{
c+=(pow(-1,n))*pow(x,(2*n))/jiecheng(2*n);//公式
d=c-cos(x);
if(d<0)d=-d;//求检测误差的绝对值
}
n++;
}
printf("cos(x)近似值:%lg\ncos函数求得值:%lg\n",c,cos(x));//比较
}

long jiecheng(int x)
{
if(x>1)return x*jiecheng(x-1);
return 1;
}

这程序存在严重缺点,就是固定误差太小会导致数据溢出,然后出现错误值追问

不对啊 输入0.000001 3.14 cos3.14=1 cos3.14应该得-1啊

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网