余弦泰勒逼近C语言

Cosine Taylor approximation C language

我正在做一些简单的事情...我想,但有些事情困扰着我。

double x,t,cos_aprox,eps;
int k;
t=1.0;
k=1;
cos_aprox=1.0;`

printf("Introduceti x pentru care se calculeaza cos(x) si eroarea epsilon:\n");
if(scanf("%lf%lf",&x,&eps)!=2)
{
    printf("Date eronate!!\n");
    exit(1);
}
else
{
    do
    {
        t=t*(-1)*x*x/(k*(k+1));
        cos_aprox+=t;
        k+=2;
    }
    while(fabs(t)>eps);

    printf("Valoarea aproximativa a lui cos(%g) este %.9g. k este %d\n",x,cos_aprox,k);
    printf("Valoarea lui cos(%g), folosind functia din biblioteca, este %.9g.",x,cos(x));
}

它 returns 很好的结果,但是当我选择超过 39 弧度的任何值时,它与库函数之间存在显着差异 cos(x)

OP 对泰勒级数的使用随着 x 值的增加而受到数值限制。添加大的交替符号项会累积太多错误。修改代码以查看这些条款。

t = t*(-1)*x*x/(k*(k+1));
printf("%e\n", t);

正弦和余弦计算都受益于参数减少到 [-2π ... +2π] 的范围。以下是很好的第一步,将减少 x 在更大范围内的误差。

x = fmod(x, 2*π);

可以使用通常的三角恒等式和 remquo() 进一步缩减到范围 [0 ... +π/4]。


麻烦的是上面的计算依赖于π的一个近似值。 π 是一个无理数,不能精确表示为 double。所有有限的 double 都是有理数。因此,改为使用 machine pi

// example
#define M_PI 3.1415926535897932384626433832795
x = fmod(x, M_PI);

要在 double x 整个 范围内实现精确计算,需要复杂的扩展精度技术。搜索 大参数的参数缩减:到最后一点都很好