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

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

首先,`floatabs`函数虽然正确,但`sinus`函数中循环条件使用了`floatabs(sin)`,这里的`sin`是变量名,与标准库函数名冲突,容易混淆。更重要的是,循环逻辑有误:初始时`sin`被赋值为`x`(角度值),而不是级数项,导致第一次循环判断可能不准确。

其次,泰勒级数展开式是围绕0点的,但代码中`xrad`是弧度值,而初始的`sin`变量却用了度数`x`,这会导致计算混乱。级数的每一项应该基于`xrad`的幂次和阶乘,但代码中`up`和`down`的更新方式可能不正确。

- 检查循环条件:`sin`变量应该代表当前项的值,而不是最终结果。初始时应该用第一项`xrad`来初始化`sin`,而不是用度数`x`。
- 检查级数项的生成:泰勒级数中,第n项的分子是`xrad`的奇数次幂,分母是阶乘。你的`up`和`down`更新方式需要确保每次循环生成正确的下一项。