你这个程序太乱了。
首先不能用x-f作为判断依据啊,x是自变量,f是因变量,完全不是一个事情;你的x如果输入1,那不是x-f=0,你得到的f就是1,cos(1)=1,不可能的事情。
然后,阶乘可能很大,用double变量会好些;我给你把误差设置为截断的,就是每次需要加的那个式子
#include<stdio.h>
#include<math.h>
double funcos( double e, double x ){
double f; //cosx 当前值,因为第一项不论x给多少衡为1,初始给f的值1
double err, df;
double jiecheng;
int p;
int i; //i是计数变量,从第二项开始算1
f = 1.0;
err = 1.0;
i = 1;
while(err>e){ //精度不够
jiecheng=1.;
p=2*i; //jiecheng代表阶乘运算后的值 原谅我词穷不会起名字,p是代表阶乘的起点,找规律得出应该是2倍i
while(p!=0){
jiecheng*=p;
p--;
}
df=pow(-1,i)*pow(x,2*i)/jiecheng; //cosx 累加,每循环一次就新加一项,三部分组成:正负号、分子、分母
f+=df;
i++;
err = fabs(df);
}
return f;
}
int main(){
printf("%.6f", funcos(1e-5, 1.));
}
然后我推荐的cos的自编程(也是根据你的程序改的)
#include<stdio.h>
#include<math.h>
double funcos( double e, double x ){
double f; //cosx 当前值,因为第一项不论x给多少衡为1,初始给f的值1
double err, df, xn;
double jiecheng;
int p;
int i; //i是计数变量,从第二项开始算1
f = 1.0;
err = 1.0;
i = 1;
jiecheng = 1。;
xn = 1.;
while(err>e){ //精度不够
jiecheng*=(2*i-1)*(2*i);//每次乘两个数不就是(2i)!吗 【分母】
xn*=-x*x;//每次上面x的2i次方乘以-1的i次方就是这个【分子】
df = xn/jiecheng;//每次加这么多
f+=df;
err = fabs(df);
i++;
}
return f;
}
int main(){
printf("%.6f", funcos(1e-5, 1.));
}