我一直在遵循教授给我们的指导,但我就是找不到哪里出错了。我还讨论了在C语言中实现泰勒级数的其他一些问题。
c - 在C语言中实现正弦和余弦的泰勒级数-LMLPHP
假设raise to(将一个数提升到x的幂)在那里。

double factorial (int n)
{
    int fact = 1,
    flag;

   for (flag = 1; flag <= n; flag++)
   {
        fact *= flag;
   }

   return flag;
}

double sine (double rad)
{

int flag_2,
    plusOrMinus2 = 0; //1 for plus, 0 for minus
double sin,
    val2 = rad,
    radRaisedToX2,
    terms;

terms = NUMBER_OF_TERMS; //10 terms

    for (flag_2 = 1; flag_2 <= 2 * terms; flag_2 += 2)
    {
        radRaisedToX2 = RaiseTo(rad, flag_2);

        if (plusOrMinus2 == 0)
        {
            val2 -=  radRaisedToX2/factorial(flag_2);
            plusOrMinus2++; //Add the next number
        }

        else
        {
            val2 += radRaisedToX2/factorial(flag_2);
            plusOrMinus2--; //Subtract the next number
        }
    }

    sin = val2;
    return sin;
 }

int main()
{
    int degree;
    scanf("%d", &degree);
    double rad, cosx, sinx;
    rad = degree * PI / 180.00;
    //cosx = cosine (rad);
    sinx = sine (rad);
    printf("%lf \n%lf", rad, sinx);
}

所以在循环过程中,我得到rad^x,除以从1开始的奇数序列的阶乘,然后根据需要加上或减去它,但是当我运行程序时,我得到的输出远远超过1,我们都知道sin(x)的极限是1和-1,我真的很想知道哪里出错了,所以我可以改进,抱歉,如果是很糟糕的问题。

最佳答案

任何超过12!的值都大于32位int的值,因此这些值将溢出,因此不会返回您所期望的值。
与其每次都计算全阶乘,不如看看序列中相对于前一个的每个项。对于任何给定的术语,下一个是前一个的-((x*x)/(flag_2*(flag_2-1))倍。因此,从一个x项开始,然后乘以每个连续项的系数。
还有一个技巧是在不知道需要多少术语的情况下,将结果计算到double的精度。我把那留给读者作为练习。

08-16 20:45