酷代码 AI
菜单

6-2 使用函数求余弦函数的近似值 分数 10 作者 C课程组 单位 浙江大学 本题要求实现一个函数,用下列公式求cos(x)的近似值,精确到最后一项的绝对值小于e: cos(x)=x 0 /0!−x 2 /2!+x 4 /4!−x 6 /6!+⋯ 函数接口定义: double funcos( double e, double x ); 其中用户传入的参数为误差上限e和自变量x;函数funcos应返回用给定公式计算出来、并且满足误差要求的cos(x)的近似值。输入输出均在双精度范围内。 裁判测试程序样例: #include <stdio.h> #include <math.h> double funcos( double e, double x ); int main() { double e, x; scanf("%lf %lf", &e, &x); printf("cos(%.2f) = %.6f\n", x, funcos(e, x)); return 0; } /* 你的代码将被嵌在这里 */ 输入

代码问题分析 你提供的代码存在一些问题,导致无法正确计算出余弦函数的近似值: 1. 静态变量 `i` 的初始化和使用:静态变量 `i` 初始化为 `-2` 并进行自增操作,这种方式会影响后续项的计算,而且当 `i >= 10` 时将其固定为 `10` 会导致后续项不再变化,无法正确累加。 2. 阶乘计算:代码中没有正确实现阶乘的计算逻辑,只是简单地进行了一些乘法操作,不能准确计算每一项的值。 3. 符号处理:代码中的符号处理比较混乱,没有清晰地按照公式的正负交替规律来处理。 修正后的代码 ```c #include <stdio.h> #include <math.h> double funcos( double e, double x ); int main() { double e, x; scanf("%lf %lf", &e, &x); printf("cos(%.2f) = %.6f\n", x, funcos(e, x)); return 0; } double funcos( double e, double x ) { double term = 1.0; // 第一项的值,即 x^0 / 0! = 1 double sum = term; // 总和,初始化为第一项的值 int n = 2; // 从第二项开始,指数为 2 int sign = -1; // 符号,第二项为负 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; } ``` 代码解释 1. 初始化变量: - `term` 用于存储每一项的值,初始化为第一项 `x^0 / 0! = 1`。 - `sum` 用于存储总和,初始化为第一项的值。 - `n` 表示当前项的指数,从 2 开始。 - `sign` 表示符号,第二项为负,初始化为 `-1`。 2. 循环计算每一项: - 在循环中,首先计算当前项的阶乘。 - 然后根据公式计算当前项的值。 - 判断当前项的绝对值是否小于误差上限 `e`,如果是则跳出循环。 - 将当前项累加到总和 `sum` 中。 - 更新符号 `sign` 为其相反数。 - 指数 `n` 增加 2,准备计算下一项。 3. 返回结果: - 循环结束后,返回总和 `sum` 作为余弦函数的近似值。 复杂度分析 - 时间复杂度:$O(k)$,其中 $k$ 是满足误差要求所需的项数。 - 空间复杂度:$O(1)$,只使用了常数级的额外空间。 [2025-12-10 22:30:07 | AI问答 | 787点数解答]

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