余弦泰勒逼近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
的 整个 范围内实现精确计算,需要复杂的扩展精度技术。搜索 大参数的参数缩减:到最后一点都很好
我正在做一些简单的事情...我想,但有些事情困扰着我。
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
的 整个 范围内实现精确计算,需要复杂的扩展精度技术。搜索 大参数的参数缩减:到最后一点都很好