基于泰勒级数实现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", °ree_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
相关产品推荐
相关产品推荐

