求教一个用c语言写cos展开式的问题

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

double funcos(double e, double x);

int main()
{
    double e, x;

    scanf("%lf %lf", &e, &x);
    printf("cos(%.2f) = %.6f\n", x, funcos(e, x));

    return 0;
}

这是主函数。

下面有两种写法,第一种是用函数求阶乘和乘方,然后相除,但是不对

double f(double n)
{
    double i, p = 1;
    for (i = 1;i <= n;++i)
        p *= i;
    return p;
}
double s(double x, double n)
{
    double i, p = 1;
    for (i = 1;i <= n;++i)
        p *= x;
    return p;
}
double funcos(double e, double x)
{
    double m, sum = 0, n[30];n[0] = 1;int i;
    for (i = 1;(m = s(x, 2 * i) / f(2 * i)) >= e;++i)
    {
        n[i] = m;sum += n[i];
    }
    n[i] = m;sum += n[i];
    return sum;

}

还有一种是把阶乘和乘方直接运算,结果通过了

double funcos(double e, double x)
{
    double sum=1;
    int i,k=-1;
    double m1 = 1, m2 = 1, m3 = 1;
    for (i = 2;m1 > e;i=i+2)
    {
        m2 = m2 * x * x;
        m3 = m3 * i * (i - 1);
        sum += k*m2 / m3;
        k = -k;
    }
    return sum;
}



为什么第一种不行,第二种可以呢?

你好,我是问答小助手,非常抱歉,本次您提出的有问必答问题,目前超出我们的服务范围,暂时无法为您解答。

首次提问人员可免费体验一次有问必答服务。目前首次提问的问题服务范围为:Java开发、数据库等领域,为您提供问题的解决思路和指导。不提供源码代写、项目文档代写、论文代写、安装包资源发送或安装指导等服务。

我们后续会持续优化,扩大我们的服务范围,为您带来更好地服务。

第一种没有注意加减,类似第二种的k = -k。

第一种还有个问题,超过30次运算会报错