c - 在 C 中实现正弦和余弦的泰勒级数

标签 c trigonometry taylor-series

我一直在遵循教授给我们的指南,但我就是找不到哪里出错了。我还一直在研究有关在 C 中实现泰勒级数的其他一些问题。

enter image description here

假设存在 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", &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 开始的奇数级数的阶乘,然后根据需要对其进行加减,但是当我运行程序时,我得到了输出方式大于一,我们都知道 sin(x) 的极限是 1 和 -1,我真的很想知道我哪里做错了,这样我就可以改进,抱歉,如果这是一个非常糟糕的问题。

最佳答案

超过 12! 的任何内容大于 32 位 int 的容量,所以这些值会溢出,因此不会返回您期望的结果。

与其每次都计算完整的阶乘,不如看看序列中的每一项相对于前一项的情况。对于任何给定的术语,下一个是 -((x*x)/(flag_2*(flag_2-1))前一个的倍数。所以从 x 开始,然后为每个连续的项乘以该因子。

还有一个技巧可以将结果计算到 double 的精度不知道你需要多少条款。我将把它作为练习留给读者。

关于c - 在 C 中实现正弦和余弦的泰勒级数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40808804/

相关文章:

actionscript-3 - 如何计算旋转形状 AS3 中点的位置

c - 泰勒定理 C

计算 e^x 的 Haskell 函数

java - 在圆上绘制点

javascript - Javascript 中带有加减号 (±) 的极坐标曲线方程

c - 为什么我的用于计算余弦的泰勒级数对于某些输入不准确?

点之间的比较。和整数

在 C 中创建结构体数组

c - 使用 malloc 进行堆栈对齐

c - Linux API 确定进程拥有的套接字