当没有 pow 和事实时,这怎么是泰勒函数?

问题描述 投票:0回答:1
   long double s21_cos(double x) {
  long double result;
  if (s21_isnan(x) || s21_isinf(x)) {
    result = NAN;  
  } else {
    
    while (x > s21_M_PI) {
      x -= 2 * s21_M_PI;
    }
while (x < -s21_M_PI) {
  x += 2 * s21_M_PI;
}

result = 1.0;
long double term = 1.0;
long double sign = -1.0;
long double divident, divisor;
int iteration_n = 1;
printf("%Lf-", result);
for (int n = 2; s21_fabs(term) > 1e-20; n += 2) {
  divident=x*x;

  devisor=(n*(n-1));
  
  term = term * divident / devisor;
  if(sign<0)
  printf("+");
  else if(sign>0)printf("-"); 
  result += sign * term;


     sign *= -1.0;
      iteration_n++;
    }
  }
  return result;
}

它工作得很好,但我很难理解或找到有关这种泰勒展开的任何信息。它不使用 pow,也不使用事实,但在每个术语中,它都会生成有效的比率作为答案,尽管分数数量会减少。例如,在输入为 2 的第二次迭代中,原始函数项将为 16/24,但在本次迭代中为 8/12 这是输入为 2 时步骤的输出:

1.000000-4.00000000000000000000/2.000000+8.00000000000000000000/12.000000-2.66666666666666666674/30.000000+0.35555555555555555557/56.000000-0.02539682539682539683/90.000000+0.00112874779541446208/132.000000-0.00003420447864892309/182.000000+0.00000075174678349282/240.000000-0.00000001252911305821/306.000000+0.00000000016377925566/380.000000-0.00000000000172399216/462.000000+0.00000000000001492634/552.000000-0.00000000000000010816/650.000000+0.00000000000000000067/756.000000

请尝试向我解释一下,我已经为此奋斗了两天。

c math trigonometry taylor-series
1个回答
0
投票

没有 pow 或fact,因为这些函数的定义已在 for 循环内扩展。

for (int n = 2; s21_fabs(term) > 1e-20; n += 2)

以下是步骤例程:

term = term * divident / devisor;

尽管变量名不好,但发生的事情很清楚;在循环的每一步中,我们将项乘以泰勒级数分子和分母中的下一步生成;所以 term 始终是正确的值。

© www.soinside.com 2019 - 2024. All rights reserved.