如何解决以下正弦级数求和C代码中的段错误?
正弦级数求和代码的段错误排查与修复
核心问题分析与解决
段错误根源:
scanf调用错误。scanf需要传入变量的内存地址来存储输入值,原代码直接传变量值,导致程序试图向非法内存地址写入,触发段错误。
错误代码:scanf("%d",num); scanf("%d",xval);修正为:
scanf("%d", &num); scanf("%lf", &xval); // xval改为double类型后用%lf格式符语法错误:
if语句的大括号不匹配,导致else块无法与if配对,编译时会报错。需要调整大括号位置,让if和else属于同一个循环体代码块。数据类型错误:原代码用
int存储级数和、项值等浮点数结果,会完全丢失小数部分,导致计算结果失真。应将sum、term、xval改为double类型,适配正弦级数的浮点特性。逻辑错误:原代码遗漏了正弦级数的阶乘分母,正确的正弦级数公式为:
sin(x) = x - x³/3! + x⁵/5! - x⁷/7! + ... + (-1)^(n-1) * x^(2n-1)/(2n-1)!
原代码仅计算了x的奇数次方的加减,未除以对应阶乘,结果与真实正弦值偏差极大。
优化后的完整代码(递推版,高效且精度高)
#include <math.h> #include <stdio.h> int main(){ int num; double xval; double sum = 0.0; double term; printf("Enter number of terms: "); scanf("%d", &num); printf("Enter value of x (in radians): "); scanf("%lf", &xval); // 递推计算:利用前一项结果生成当前项,避免重复计算阶乘和幂 term = xval; sum = term; for(int i = 1; i < num; i++){ // 递推公式:当前项 = 前一项 * (-x²) / [(2i)*(2i+1)] term = term * (-xval * xval) / ((2*i) * (2*i + 1)); sum += term; } printf("Sum of the series is: %.6lf\n", sum); printf("Standard sin(x) value: %.6lf\n", sin(xval)); // 对比标准库结果 return 0; }
代码说明
- 递推方式避免了重复计算阶乘和幂运算,效率更高且精度损失更小。
- 输入的x需要是弧度值,与标准库
sin函数的参数要求一致。 - 输出保留6位小数,便于和标准结果对比验证。
内容的提问来源于stack exchange,提问作者Lelouch
相关产品推荐
相关产品推荐

