输入精度 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 就错了呀
追答没错
#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;
}
我没有认真看过你的程序,我很 仓促的写了下我的程序,虽然有很很多漏洞,但也许可以帮助你理解这种求近似值的算法
#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啊