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

#include <stdio.h> float cosinus(float x) { float sum = 1.0f; float term = 1.0f; int sign = -1; int n = 2; while (1) { // 递推计算下一项 x^n / n! term = term * x * x / ((n - 1) * n); float current = sign * term; // 项绝对值小于0.001,停止,不加入总和 if (current > -0.001f && current < 0.001f) { break; } sum += current; sign = -sign; n += 2; } return sum; }
这段代码实现了一个计算余弦函数近似值的函数。它使用泰勒级数展开式 cos(x) = 1 - x²/2! + x⁴/4! - x⁶/6! + ... 来逐项累加,直到某一项的绝对值小于0.001时停止。

- 你的循环在判断项是否足够小时,使用了 `current > -0.001f && current < 0.001f` 这个条件。但注意,`current` 可能是正数也可能是负数,这个条件实际上只检查了绝对值小于0.001的情况,逻辑上是对的。不过,你是在计算完 `current` 之后才判断,并且如果满足条件就直接 `break`,没有把这一项加到 `sum` 里。这符合你的注释“不加入总和”,但需要确认这是否是你想要的效果——通常泰勒级数会在项足够小时停止,但最后一项是否加入取决于精度要求。

- 另一个需要注意的地方是:你的 `term` 递推公式 `term = term * x * x / ((n - 1) * n)` 是正确的,但要注意 `n` 从2开始,第一次计算时 `(n-1)*n` 是 1*2=2,对应第二项 x²/2!。然而,你的初始 `sum` 已经包含了第一项 1,所以循环从第二项开始计算,这是合理的。但检查一下当 `x` 很大时,这个递推是否会导致数值不稳定?比如 `x` 很大时,中间项可能先变大再变小,你的循环条件只检查当前项,可能提前退出,导致精度不足。