泰勒级数近似计算sin(x)代码循环故障排查求助
修复泰勒级数近似sin(x)的C语言循环问题
原代码的核心问题
- 阶乘计算错误:原代码中计算的不是
(2k+1)!,而是(2k+1)*k!,导致每一项的分母完全错误,近似值偏差极大。 - 循环终止逻辑颠倒:在累加当前项之前就判断误差是否满足,初始
Sx为0时可能直接跳出循环,结果完全错误;且依赖精确值Yx判断误差,实际可利用交错级数性质优化。 - 重复计算效率低:每次用
pow计算符号和幂次,既浪费性能又可能引入精度损失。
修复后的代码
#include <stdio.h> #include <math.h> int main(){ double x, E; printf("x: "); scanf("%lf", &x); printf("E: "); scanf("%lf", &E); // 输入合法性检查,不符合则提示并退出 if(fabs(x) >= 1 || E >= 1e-4) { if(fabs(x) >= 1 && E >= 1e-4) printf("请修改x和ε\n"); else if(E >= 1e-4) printf("请修改ε\n"); else printf("请修改x\n"); return 1; } double Yx = sin(x); double Sx = 0.0; double term = x; // 初始项:k=0时,x^1 / 1! = x int k = 0; // 双重判断:当前项绝对值小于E(交错级数余项性质)且误差满足要求 while(fabs(term) > E && fabs(Sx - Yx) > E) { Sx += term; k++; // 递推计算下一项:符号取反、x幂次平方、阶乘乘(2k)*(2k+1) term *= (-1) * x * x / ((2*k) * (2*k + 1)); } printf(" Y(x) = %.6lf\n", Yx); printf(" S(x) = %.6lf\n", Sx); printf(" |S(x)-Y(x)| = %.6lf \n", fabs(Yx - Sx)); return 0; }
关键修复说明
- 递推式计算泰勒项:每一项基于前一项推导,避免错误的阶乘计算,同时省去
pow调用,提升精度和效率。 - 调整循环终止逻辑:先累加当前项,再通过交错级数性质(余项绝对值小于下一项绝对值)和误差值双重判断,确保结果满足精度要求。
- 完善输入检查:不符合条件时直接退出程序,避免后续无效执行。
内容的提问来源于stack exchange,提问作者Vladick
相关产品推荐
相关产品推荐

