我一直在遵循教授给我们的指导,但我就是找不到哪里出错了。我还讨论了在C语言中实现泰勒级数的其他一些问题。
假设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", °ree);
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
的精度。我把那留给读者作为练习。