Online Compiler C

#include <stdio.h> float sinus(float x) { float sum = 0.0f; int sign = 1; int n = 1; while (1) { float r = 1.0f; for (int i = 0; i < n; i++) r *= x; float fact = 1.0f; for (int i = 1; i <= n; i++) fact *= i; float term = sign * r / fact; if (fabs(term) < 0.001f) break; sum += term; sign = -sign; n += 2; } return sum; }
这段代码试图用泰勒级数计算正弦函数,但存在几个问题。

- 循环条件 `while (1)` 配合 `break` 虽然可行,但需要确保收敛判断正确。当前判断 `fabs(term) < 0.001f` 可能过早退出,导致精度不足。
- 变量 `n` 从1开始,但泰勒级数的项对应的是奇数阶:1, 3, 5... 你的代码中 `n` 递增2是正确的,但计算幂和阶乘时,`n` 的值与项数不匹配。第一项应该是 `x^1/1!`,第二项是 `x^3/3!`,但你的循环中 `n` 第一次是1,第二次变成3,这没问题。然而,你每次循环都重新从0到n计算幂和阶乘,效率低但逻辑上正确。关键问题在于:当 `n=1` 时,你计算了 `x^1` 和 `1!`,但泰勒级数的第一项是 `x`,符号为正,这正确。但检查一下:当 `n=1` 时,`term = 1 * x / 1 = x`,正确。当 `n=3` 时,`term = -1 * x^3 / 6`,也正确。所以计算本身似乎没问题。

- 主要问题:你使用了 `fabs` 但没有包含 `<math.h>` 头文件。这会导致编译错误或未定义行为。

- 另外,`float` 类型精度有限,但这不是核心错误。建议检查头文件是否缺失。