【问题标题】:Cosine Taylor approximation C language余弦泰勒逼近C语言
【发布时间】:2017-06-06 15:32:55
【问题描述】:

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

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));
}

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

【问题讨论】:

  • 仅当参数在[-pi/4,pi/4] 范围内时有效。您需要大整数数学来计算减少所需的 pi 位数。论文:citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.67.5616
  • 在 while 循环之前使用x = fmod(x, 2*pi); 进行改进。对于像x > 1e10 这样的大型x,这仍然会有问题。如何使用您自己的代码在广泛的范围内精确地工作cos() 的细节并不是“简单的事情”

标签: c trigonometry taylor-series


【解决方案1】:

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

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

正弦和余弦计算都可以通过将参数简化为 [-2π ... +2π] 的范围。以下是很好的第一步,将在更大范围内减少x 的错误。

x = fmod(x, 2*π);

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


问题是上面的计算依赖于一个近似的π值。 π 是一个无理数,不能完全表示为 double。所有有限的double 都是有理数。所以改为使用 machine pi

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-11
    • 2022-07-10
    • 2021-08-12
    • 2021-08-13
    • 2017-04-10
    • 2015-11-21
    • 1970-01-01
    • 2020-02-04
    相关资源
    最近更新 更多