使用泰勒级数计算 sin(x)

2023-12-12

Task:根据 sin(x) 的泰勒级数,使用名为的双精度函数进行计算mysin将其传递给双变量。从用户处获取 x 值并使用 mysin 函数计算 sin(x)。

Sin()x Tyler Series Formula

问题是程序给出了错误的 sin(x) 值。我花了大约 4 个小时试图解决这个问题,但找不到它。是因为 sin(x) 函数还是我在代码中遗漏了某些内容?

My Code:

#include <stdio.h>

double mysin(double x)
{
    double value = x;
    double sum = x;
    int neg_pos = 1;
    int fac = 1;
    
    int counter = 0;
    
    while(1)
    {
        neg_pos *= -1;
        fac += 2;
        
        value = value/(fac*(fac-1));
        value = value*x*x*neg_pos;

        sum += value;
        
        //printf("Hello");
        counter++;
        if (counter == 100) break;
    }
    return sum;
}

int main()
{
    double number;
    scanf("%lf",&number);
    printf("%g",mysin(number));
    //printf("%g",number);
}

问题是你要乘以neg_pos每一步,在+1和-1之间切换。这意味着术语只有一半的时间改变符号,而它们每次都应该改变符号。

解决办法是每次只乘以 -1 而不是neg_pos.

这是程序的一个稍微简化的工作形式,它计算 0 到 3 范围内的数字的 sin,显示要比较的 stdlib 计算。

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

double mysin(double x) {
    double value = x;
    double sum = x;
    int fac = 1;
    
    for (int counter = 0; counter < 100; counter++) {
        fac += 2;
        value = -value*x*x/fac/(fac-1);
        sum += value;
    }
    return sum;
}

int main() {
    for (double x = 0.0; x < 3.0; x += 0.1) {
       printf("%g: %g %g\n", x, mysin(x), sin(x));
    }
}

您还可以避免单独的fac and counter变量,也许像这样:

double mysin(double x) {
    double term=x, sum=x;
    for (int f = 0; f < 100; f++) {
        term = -term*x*x/(2*f+2)/(2*f+3);
        sum += term;
    }
    return sum;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用泰勒级数计算 sin(x) 的相关文章