Онлайн компилятор C

#include <stdio.h> float factorial(int n) { float result = 1; for (int i = 1;i <= n; i++){ result *= i; } return result; } float ctenehb( int m, int p ){ float result_1 = 1; for (int j = 1; j <= p; j++){ result_1 *= m; } return result_1; } float modylb(float q) { if (q < 0 ) { return -q; } return q; } float cosinus(float x){ float rlen = 1; int plus = 1, n=0 ; float cymma = 0; while (modylb(rlen) > 0.001 ) { cymma += rlen; n += 2; plus *= -1; rlen = plus * (ctenehb( x, n )/factorial(n)); } return cymma; } int main() { printf("%0.3f", cosinus(1.57) ); return 0; }
这段代码试图用泰勒级数计算余弦函数 cos(x) 的近似值。它定义了几个辅助函数:factorial 计算阶乘,ctenehb 计算幂次,modylb 计算绝对值,cosinus 用循环累加级数项直到项小于 0.001。

- 在 cosinus 函数中,初始项 rlen 设为 1,对应泰勒级数的第一项(n=0 时,x^0/0! = 1)。但循环开始前没有将第一项加入 cymma,而是先进入循环,这样第一项被正确加入。然而,循环内更新 n 和 rlen 的顺序可能导致项的计算有误:每次循环先累加当前项,然后 n 增加 2,再计算下一项。但泰勒级数中,第一项之后的下一个非零项是 n=2 的项,而你的代码在第一次循环后 n 变为 2,然后计算 rlen,这符合级数顺序。但注意,循环条件检查的是更新前的 rlen,而第一次循环时 rlen 是 1,满足条件,之后累加并更新。整体逻辑基本正确,但有一个细节问题。

- 主要问题在于:泰勒级数中,cos(x) = 1 - x^2/2! + x^4/4! - ...,你的代码中 plus 初始为 1,第一项符号正确。但每次循环后 plus 取反,然后计算下一项时乘以 plus,这会导致第二项符号为负,正确。但注意,在循环内,你是在累加当前项之后才更新 n 和 plus,然后计算下一项。这意味着第一次循环累加的是第一项(n=0 时的项),但你的 rlen 初始为 1,而循环内并没有显式处理 n=0 的情况,而是直接使用 rlen=1 作为第一项。这没问题,但后续项的计算中,n 从 2 开始,而 ctenehb(x, n) 计算 x 的 n 次方,factorial(n) 计算 n 的阶乘,这符合级数。然而,你的循环条件检查的是更新前的 rlen,而第一次循环后 rlen 被更新为第二项的值,然后检查该值是否大于 0.001,这