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

如何解决以下正弦级数求和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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 23:10:31