我一直在遵循教授给我们的指南,但我就是找不到哪里出错了。我还一直在研究有关在 C 中实现泰勒级数的其他一些问题。
假设存在 RaiseTo(提高一个数的 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 开始的奇数级数的阶乘,然后根据需要对其进行加减,但是当我运行程序时,我得到了输出方式大于一,我们都知道 sin(x) 的极限是 1 和 -1,我真的很想知道我哪里做错了,这样我就可以改进,抱歉,如果这是一个非常糟糕的问题。
超过 12!
的任何内容大于 32 位 int
的容量,所以这些值会溢出,因此不会返回您期望的结果。
与其每次都计算完整的阶乘,不如看看序列中的每一项相对于前一项的情况。对于任何给定的术语,下一个是 -((x*x)/(flag_2*(flag_2-1))
前一个的倍数。所以从 x
开始,然后为每个连续的项乘以该因子。
还有一个技巧可以将结果计算到 double
的精度不知道你需要多少条款。我将把它作为练习留给读者。
我是一名优秀的程序员,十分优秀!