c语言 使用函数求余弦函数的近似值

程序最后总是不精确...为什么?
/*程序填空,不要改变与输入输出有关的语句。
输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:
输入精度 e 和 x,用下列公式求cos(x)的近似值,精确到最后一项的绝对值小于e。
cos(x) = x^0/0!-x^2/2!+x^4/4!-x^6/6!+……
要求定义并调用函数 funcos(e,x)计算 cos(x) 的值,函数形参e和x的类型均为double,函数类型是double。
输入输出示例:括号内是说明
输入:
2 (repeat=2)
0.001 0 (e=0.001, x=0)
0.0001 -3.14 (e=0.0001, x=-3.14)
输出:
sum = 1.000000
sum = -0.999999
*/

#include "stdio.h"
#include "math.h"
double funcos(double e, double x);
double fact(int i);
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);
}
return 0;
}

double funcos(double e, double x)
{
int i=0;
double item;
double cosx=0;
int flag=1;
item=pow(x,2*i)/fact(2*i);
while(fabs(item)>=e){
cosx+=flag*item;
flag=-flag;
i++;
item=pow(x,2*i)/fact(2*i);
}
return cosx;
}

double fact(int i)
{
int a;
double fact=1;
for (a=1;a<=i;a++)
fact*=a;
return fact;
}

double funcos(double e, double x)
{
    if(e>0)
    {
        int i=0;
        double item=1;
        double cosx=0;
        while(fabs(item)>=e)
        {
             cosx+=item;
             i++;
             item*=-1*x*x/(2*i*(2*i-1))
        }
        return cosx;
    }
    else
        return -2;
}

温馨提示:答案为网友推荐,仅供参考
相似回答