基于泰勒级数的C语言余弦值计算代码问题求助
问题分析与修正代码
你的代码存在多个关键错误,导致计算结果完全偏离预期,下面逐个说明并给出修正方案:
核心错误点
- 泰勒级数逻辑完全混乱:
meincosinus函数里你把输入的角度值x直接覆盖成了阶乘结果fac(n),彻底丢失了公式里的角度变量,完全不符合余弦泰勒级数的定义。 - 循环条件不合理:用
n <= x作为循环终止条件毫无依据——泰勒级数的迭代次数和输入角度值无关,应该用固定的足够多次数(比如15次),或者直到计算项的绝对值小于极小值(如1e-10)来保证精度。 - 阶乘溢出问题:
fac函数用int类型存储结果,当n≥13时,阶乘结果会超出int的最大值导致溢出,计算直接出错,必须改用double类型计算阶乘。 - 角度单位不匹配:计算器的
cos(50)是50度的余弦值,但泰勒级数计算的是弧度的余弦值,必须先把输入角度转换成弧度(弧度 = 角度 × π / 180)。 - main函数笔误:你调用
sin(x)却打印成cos的结果,属于低级错误。
修正后的代码
#include <stdio.h> #include <math.h> // 用double计算阶乘,避免数值溢出 double fac(int n) { double prod = 1.0; for (int i = 1; i <= n; i++) { prod *= i; } return prod; } // 基础版:直接按泰勒级数公式计算(输入为弧度) double meincosinus(double x_rad) { double erg = 0.0; // 迭代15次足够收敛到高精度 for (int n = 0; n <= 14; n++) { // 余弦泰勒级数公式:Σ[(-1)^n * x^(2n) / (2n)!] double term = pow(-1, n) * pow(x_rad, 2 * n) / fac(2 * n); erg += term; } return erg; } // 高效版:递推计算每一项,避免重复计算阶乘和高次幂 double meincosinus_fast(double x_rad) { double erg = 1.0; // n=0时的初始项 double term = 1.0; for (int n = 1; n <= 14; n++) { // 递推公式:第n项 = 第n-1项 * (-x²)/(2n*(2n-1)) term *= (-x_rad * x_rad) / (2 * n * (2 * n - 1)); erg += term; } return erg; } int main() { double x_deg; printf("请输入角度值:\n"); scanf("%lf", &x_deg); // 角度转弧度,匹配泰勒级数的计算要求 double x_rad = x_deg * M_PI / 180.0; double y1 = meincosinus(x_rad); printf("自定义cos(%.2lf°)=%.10lf\n", x_deg, y1); double y2 = meincosinus_fast(x_rad); printf("快速版自定义cos(%.2lf°)=%.10lf\n", x_deg, y2); // 用math.h的cos函数做结果对比(注意传入弧度值) double y3 = cos(x_rad); printf("math.h的cos(%.2lf°)=%.10lf\n", x_deg, y3); // 暂停程序查看结果 printf("输入任意整数退出:\n"); int i; scanf("%d", &i); return 0; }
补充说明
- 新增角度转弧度步骤后,输入50度时,计算结果会和计算器的
0.6427...完全匹配。 - 提供两个版本的计算函数:基础版直观对应泰勒级数公式,高效版通过递推避免重复计算,性能更好且彻底规避阶乘溢出问题。
- 循环次数设为15次,足以让结果收敛到高精度(误差小于1e-10)。
内容的提问来源于stack exchange,提问作者Matthias
相关产品推荐
相关产品推荐

