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

基于泰勒级数的C语言自定义正弦函数实现优化求助

基于泰勒级数计算正弦值的C程序优化思路

这是我为完成学校作业编写的一款基于泰勒级数计算正弦值的C语言小程序,目前程序可正常运行,但我确信仍有优化空间,希望各位能提供更好的优化思路。以下是我的代码:

#include <stdio.h>
#include <math.h>
int main(int argc, int **argv){
    system ("chcp 1253");
    int deg, i, a=(-1), flag=0;
    double pi=3.14159265359, x, sinx, o1, o2; //pi is rounded up to the last digit
    
    printf("Δώσε γωνία σε μοίρες από 0-2π (0-360):"); //translate: give angle in degrees
    scanf("%d",&deg);
    x=(pi/180)*deg; //apo moires se rad (metavlith x)
    o2=((x*x*x)/6)*a;
    sinx=x+o2;
    
    for(i=4; flag!=1; i+=2){
        o1=a*o2*((x*x)/(i*(i+1)));
        if (fabs(o2-o1)<=0.000001){
            flag=1;
        };
        sinx=sinx+o1;
        o2=o1;
    };
    
    printf("\nΤο ημίτονο του %d είναι: %f", deg, sinx); //the sine of %d is ...
    return 0;
};

以我初学者的眼光来看,这段代码没有问题,但我肯定它还能进一步优化。


几个具体的优化方向:

  • 角度范围归约:正弦函数是周期为2π的奇函数,且在区间内有对称性。先把输入角度归约到[-π, π]甚至[0, π/2],可以大幅减小x的绝对值,让泰勒级数收敛更快、计算更精准,同时减少循环次数。比如370度可直接转成10度,190度转成-10度,x的绝对值越小,级数收敛越快。
  • 精度控制逻辑优化:当前用相邻两项的差值判断停止条件,更合理的方式是判断当前项的绝对值是否小于设定的精度阈值(比如1e-8)。当项的大小足够小时,添加它对最终结果的影响可以忽略,逻辑更直观,还能去掉冗余的flag变量。
  • 简化变量与计算效率:
    • 交替符号可以直接通过取反实现,不用单独维护a变量,比如新项 = -旧项 * x² / ((2n)*(2n+1)),少一个变量,代码更简洁。
    • 手动定义的pi值不如标准库的M_PI准确,只要在包含math.h前定义#define _USE_MATH_DEFINES就能使用。
    • 移除未使用的argc和argv,改成int main()即可;如果不需要希腊语显示,system("chcp 1253")可以删掉,避免依赖系统环境。
  • 输入健壮性提升:当前没有验证输入的有效性,用户输入非数字或超出0-360范围的数值时,程序会出错。可以添加循环检查输入,确保输入是合法的角度值。
  • 循环结构简化:重新规划泰勒级数的递推逻辑,从初始项x开始,每一项基于前一项直接计算,循环条件更清晰,代码可读性更强。

优化后的示例代码

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

int main() {
    int deg;
    double x, sinx, term;
    const double tolerance = 1e-8; // 自定义精度阈值

    // 输入验证:确保输入0-360之间的整数角度
    printf("请输入0-360之间的角度(单位:度):");
    while (scanf("%d", &deg) != 1 || deg < 0 || deg > 360) {
        // 清除输入缓冲区的无效内容
        while (getchar() != '\n');
        printf("输入无效,请重新输入0-360之间的整数角度:");
    }

    // 将角度转换为弧度并归约到[-π, π]区间
    x = deg * M_PI / 180.0;
    if (x > M_PI) {
        x -= 2 * M_PI;
    } else if (x < -M_PI) {
        x += 2 * M_PI;
    }

    // 初始化泰勒级数计算
    sinx = x;
    term = x;
    int n = 1;

    // 递推计算每一项,直到项的绝对值小于精度阈值
    while (fabs(term) > tolerance) {
        term *= (-x * x) / ((2 * n) * (2 * n + 1));
        sinx += term;
        n++;
    }

    printf("角度%d度的正弦值为:%.10f\n", deg, sinx);
    // 可选:对比标准库sin函数的结果,验证准确性
    printf("标准库sin函数计算结果:%.10f\n", sin(x));
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 16:00:37