Online Compiler C

#include <math.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; }
这段代码试图用泰勒级数展开计算正弦函数 sin(x),但存在几个关键问题。

- 循环中 n 从 1 开始,每次增加 2,这对应泰勒级数的奇次项。但 n=1 时计算的是 x^1 / 1!,这实际上是第一项,而泰勒级数第一项应该是 x,所以这一项是对的。然而,当 n=3 时计算的是 x^3 / 3!,但符号应该是负的,这里 sign 初始为 1,第一次循环后 sign 变为 -1,所以第二次循环 term 的符号正确。但问题在于:泰勒级数中每一项的符号是交替的,但第一项是正,第二项是负,第三项是正……你的 sign 变化逻辑是正确的。

- 主要问题在于:泰勒级数中分母是阶乘,但你的阶乘计算是从 1 到 n,而 n 是奇数(1,3,5,...),所以分母是 n!,这正确。但分子是 x^n,也正确。然而,你的循环终止条件是 fabs(term) < 0.001,这会导致精度不够,但这不是根本错误。

- 更严重的问题是:你的循环没有对 x 进行任何范围缩减。泰勒级数只在 x 接近 0 时收敛快,如果 x 很大(比如 10 或 100),级数需要很多项才能收敛,甚至可能不收敛。而且你的循环是无限循环,如果 term 一直不小于 0.001,程序会永远运行下去。

- 另外,你的代码中包含了 math.h 但只用了 fabs,这没问题,但你没有处理 x 为负的情况,实际上泰勒级数对负 x 也适用,因为 x^n 的符号会自然处理。

- 一个关键错误:你的循环中 n 从 1 开始,但泰勒级数的第一项是 x,对应 n=1。但你的代码中,第一次循环计算了 x^1 / 1!,这是正确的。然而,你的循环条件 if (fabs(term) < 0.001f) break; 是在计算 term 之后立即检查,这意味着如果第一项就小于 0.001(比如 x 很小),循环会立即退出,返回 0,而正确的 sin(x) 应该接近 x