酷代码 AI
菜单

long double add(int x){ static int i=-2; i+=2; if(i>=10) i=10; static long double p=1; if(i>0) p*=-x*x/(1.0*i*(i-1)); return p; } double funcos( double e, double x ){ long double res=0; res+=add(x); long double p=res; while(p>e||p<-e){ p=add(x); res+=p; } return res; }我的代码为什么不行

你的代码在实现使用函数求余弦函数近似值时存在多个比较关键的问题,下面为你详细分析这些问题产生的原因: 1. `add` 函数中静态变量 `i` 的使用问题 在 `add` 函数里运用了静态变量 `i`,它初始值为 `-2`,每次调用函数时会增加 `2`。一旦 `i` 达到或者超过 `10`,就会被固定设为 `10`。这就造成后续所有项的计算都基于 `i = 10` 来进行,使得后续相加项不会发生变化,无法正确展开无穷级数。 ```c static int i=-2; i+=2; if(i>=10) i=10; ``` 2. 阶乘计算不准确 在 `add` 函数中,关于阶乘的计算依靠 `1.0 * i * (i - 1)` 来实现,这仅能算出当前项分母中连续的两个数的乘积,并非完整的阶乘。例如,当 `i = 4` 时,`1.0 * i * (i - 1)` 只能得到 `4 * 3`,但在 `x^4 / 4!` 里需要的是 `4 * 3 * 2 * 1`。 ```c if(i>0) p*=-x*x/(1.0*i*(i-1)); ``` 3. 符号逻辑存在问题 在 `add` 函数中,静态变量 `p` 的更新表达式 `p *=-x * x / (1.0 * i * (i - 1))` 仅能简单变更正负,但逻辑上并非严格遵循余弦级数的正负交替规则。由于每次变更都基于前面的项乘以 `-x * x / (1.0 * i * (i - 1))`,这会在计算中积累错误。 4. 缺少对第 0 项的正确处理 在 `add` 函数里,`i = -2` 时,直接返回 `p = 1`,这对应于余弦级数的第 0 项 `x^0 / 0! = 1`,然而后续计算没有考虑到正确的起始和状态。 修正方案示例 下面是修正后的代码: ```c #include <stdio.h> #include <math.h> double funcos(double e, double x); double funcos(double e, double x) { double sum = 1.0; // 初始化总和为第 0 项 double term = 1.0; // 初始化当前项为第 0 项 int n = 2; // 从第 2 项开始 int sign = -1; // 符号,第 2 项为负 while (1) { double factorial = 1.0; // 计算阶乘 for (int i = 1; i <= n; i++) { factorial *= i; } // 计算当前项的值 term = sign * pow(x, n) / factorial; // 判断是否满足误差要求 if (fabs(term) < e) { break; } // 累加当前项到总和 sum += term; // 更新符号 sign = -sign; // 指数增加 2,计算下一项 n += 2; } return sum; } int main() { double e, x; scanf("%lf %lf", &e, &x); printf("cos(%.2f) = %.6f\n", x, funcos(e, x)); return 0; } ``` 修正说明 - 去掉了 `add` 函数,直接在 `funcos` 函数里实现级数的计算。 - 正确计算每一项的阶乘。 - 运用 `sign` 变量严格遵循正负交替规则。 - 对第 0 项进行正确的初始化和处理。 - 当某一项的绝对值小于误差 `e` 时,停止循环,返回总和。 [2025-12-10 22:32:40 | AI问答 | 957点数解答]

服务商
相关提问
发财导航,免费问AI
实用工具查看更多