在线编译器 C

#include <stdio.h> float sinus(float x) { float sum = x; float term = x; int znak = -1; int step = 3; while (1) { term = term * x * x / ((step - 1) * step); float elem = znak * term; // 如果当前项绝对值小于0.001,停止计算,不加入总和 if (elem > -0.001f && elem < 0.001f) { break; } sum += elem; znak = -znak; step += 2; } return sum; }
这段代码试图用泰勒级数计算正弦函数 sin(x)。它使用递推方式计算每一项,并当项的值小于 0.001 时停止。

代码中存在一个逻辑错误,导致计算结果不正确。

- 检查循环中计算下一项 term 的公式。注意当前项 term 代表的是第 n 项的值,而下一项应该由当前项乘以 x² 再除以 (2n)(2n+1) 得到。你的分母使用了 (step-1)*step,但 step 的初始值是 3,这会导致第一轮循环中分母计算错误。
- 思考一下:在进入循环之前,term 已经等于 x(即第一项)。循环中应该先处理当前项,再计算下一项。你的代码顺序是:先计算下一项 term,然后判断是否加入总和。这样第一项 x 实际上从未被判断是否小于 0.001,而且第一轮循环中计算出的 term 是第二项,但判断的是第二项的值,这会导致逻辑混乱。