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

基于泰勒级数实现sin x的C程序仅显示输入提示的问题求助

泰勒级数计算sin(x)的代码运行异常排查与修复

实际运行故障表现

程序启动后仅能打印输入角度的提示文本,输入数值后无后续计算结果输出,程序处于无响应状态。

逐点定位的核心错误

  • 第一处死循环(程序无输出的直接原因):代码中while(i== 1) value = value+ x; 给i硬赋值为1,循环内部既没有修改i值的自增逻辑,也没有break跳出语句,程序会卡在这个无限循环中,永远走不到后续输入接收、弧度转换和计算流程,这就是看不到输出的根本原因。这段代码原本只是要给结果累加首项x,完全不需要写循环逻辑。
  • 第二处角度转弧度公式错误:代码中原写的x= (pi * x)/100; 不符合角度转弧度的数学规则,正确转换公式应为 弧度值 = 角度值 * π / 180,除以100的换算关系完全错误,即使程序能跑通,计算出的sin值也会和真实值偏差极大。
  • 第三处第二组死循环:循环结构while (i%2 !=0) 没有配置内部变量修改逻辑,只要遍历到i为3、5、7、9这类奇数时,循环判断条件永远成立,程序会再次进入无限循环卡死。
  • 第四处泰勒展开逻辑完全错位:正弦函数的泰勒展开仅包含奇次幂项,需要实现x1/1!、-x3/3!、+x^5/5!…的交替加减规则,代码中嵌套的内层j循环完全是冗余设计,会对同一个项反复计算N次,符号判断的位置完全错误,和计划的“展开10项”目标不匹配。
  • 第五处阶乘函数的类型溢出风险:原fact函数返回int类型,当计算到10次展开项(对应19!)时,数值远超int类型的取值范围,会出现溢出导致的计算值错误。
  • 额外精度问题:原宏定义pi取3.142,有效数字太少,会进一步放大最终计算结果的误差。

修复后的可运行代码

#include<stdio.h>
#include<math.h>

#define pi 3.1415926535

double fact(int);

int main()
{
    int sign = 1;
    float degree_x;
    double x, value = 0, nume, deno;
    printf("Enter the value for sin x in degrees: \t");
    scanf("%f", &degree_x);
    // 修正角度转弧度公式
    x = (pi * degree_x) / 180;
    
    // 按计划展开10个奇次项,对应幂次为1、3、5...19
    for(int i = 0; i < 10; i++)
    {
        int power = 2 * i + 1;
        nume = pow(x, power);
        deno = fact(power);
        value += sign * (nume / deno);
        // 交替切换正负号,实现项的加减交替
        sign = -sign;
    }

    printf("value of sin x is : \t%f", value);
    return 0;
}

double fact(int n)
{
    if(n == 0)
        return 1;
    else
        return n * fact(n - 1);
}

修复后的运行效果

程序接收用户输入的角度值后,会自动将角度转换为对应弧度值,按泰勒展开规则累加10个奇次项,无任何死循环卡点,最终直接输出sin(x)的计算结果,计算精度满足基础需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 07:36:10