在线编译器 C

#include <stdio.h> float sinus(float x) { float sin, up = x, down = 1, n = 1, znak = -1, sum = x; sin = x; while (sin > 0.001) { up = up * x * x; down = down * (n + 1) * (n + 2); sin = up / down; n += 2; sum = sum + znak * sin; znak = znak * (-1); } return sum; } int main() { int n; scanf("%d", &n); printf("%.3f", sinus(n)); return 0; }
这段代码试图用泰勒级数计算正弦值,但存在几个关键问题。

首先,`sinus`函数中的循环条件`while (sin > 0.001)`有问题。变量`sin`在循环中被更新为当前项的值,但循环应该基于当前项的大小来决定是否继续,而不是基于这个变量名。实际上,这个条件会导致循环在项变得很小时停止,但初始时`sin`等于`x`,如果`x`本身小于0.001,循环根本不会执行,直接返回`sum`的初始值`x`,这显然不对。

其次,`main`函数中读取的是整数`n`,然后直接传给`sinus`函数。但`sinus`的参数是`float`类型,这里会发生隐式转换。更关键的是,正弦函数的输入应该是弧度值,而用户输入整数时通常可能想输入角度,这会导致计算结果完全错误。

- 检查循环条件:应该用当前项(即`up/down`)的绝对值是否大于某个阈值来控制循环,而不是用变量`sin`。同时注意初始时第一项已经加到了`sum`里,循环应该从第二项开始判断。
- 考虑输入的单位:如果用户输入的是角度,需要先转换为弧度再计算。另外,`main`中读取`int`然后传给`float`参数虽然语法允许,但最好保持类型一致。