You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

泰勒级数近似计算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;
}

关键修复说明

  1. 递推式计算泰勒项:每一项基于前一项推导,避免错误的阶乘计算,同时省去pow调用,提升精度和效率。
  2. 调整循环终止逻辑:先累加当前项,再通过交错级数性质(余项绝对值小于下一项绝对值)和误差值双重判断,确保结果满足精度要求。
  3. 完善输入检查:不符合条件时直接退出程序,避免后续无效执行。

内容的提问来源于stack exchange,提问作者Vladick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 12:40:22