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
请尝试向我解释一下,我已经为此奋斗了两天。
没有 pow 或fact,因为这些函数的定义已在 for 循环内扩展。
for (int n = 2; s21_fabs(term) > 1e-20; n += 2)
以下是步骤例程:
term = term * divident / devisor;
尽管变量名不好,但发生的事情很清楚;在循环的每一步中,我们将项乘以泰勒级数分子和分母中的下一步生成;所以 term 始终是正确的值。