基于泰勒级数的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",°); 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", °) != 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
相关产品推荐
相关产品推荐

