余弦函数(cos(x))泰勒级数展开代码运行异常求助
问题排查与修复
1. 内置cos()函数参数错误
代码中调用cos(deg)时传入的是角度值,但标准库cos()函数要求参数是弧度值。这会导致内置函数输出完全错误的结果,无法和自定义实现有效对比。
修复:将cos(deg)改为cos(radian)。
2. 循环逻辑冗余(非核心错误,但影响可读性)
当前循环用n控制次数,逻辑绕弯子。余弦泰勒级数的形式是:$\cos(x) = \sum_{n=0}^{term-1} (-1)^n \frac{x^{2n}}{(2n)!}$,直接按项数循环更直观,也能避免变量冗余。
优化后的循环写法:
for(int i = 0; i < term; i++){ int exponent = 2 * i; result += sign * pow(radian, exponent) / fact(exponent); sign *= -1; }
3. 函数参数类型缺失
fact(n)函数的参数n未显式声明类型,虽然C默认会视为int,但显式声明能避免潜在的类型匹配问题,应修改为:
double fact(int n){ double x = 1; for(int i = 1 ; i <= n ; i++){ x = x*i; } return x; }
4. 精度损失问题
radian和result使用float类型,而pow()、fact()返回double,混合类型运算会导致精度损失。建议将这两个变量改为double类型,提升计算精度。
修复后的完整代码
#include <stdio.h> #include <math.h> #define PI 3.14159265358979323846 // 更精确的圆周率值 double fact(int n){ double x = 1; for(int i = 1 ; i <= n ; i++){ x = x*i; } return x; } int main(void) { int deg, term; int sign = 1; double radian, result = 0; printf("Enter the Angle (in degree) : "); scanf("%d", °); printf("Enter the number of terms : "); scanf("%d", &term); radian = deg * (PI / 180.0); for(int i = 0; i < term; i++){ int exponent = 2 * i; result += sign * pow(radian, exponent) / fact(exponent); sign *= -1; } printf("user defined cos(%d) = %lf\n", deg, result); printf("inbuilt cos(%d) = %lf\n", deg, cos(radian)); return 0; }
测试示例
输入角度90,项数5:
- 自定义实现输出:
user defined cos(90) = 0.000000(近似值) - 内置函数输出:
inbuilt cos(90) = 0.000000
输入角度0,项数3:
- 自定义实现输出:
user defined cos(0) = 1.000000 - 内置函数输出:
inbuilt cos(0) = 1.000000
内容的提问来源于stack exchange,提问作者Naveen
相关产品推荐
相关产品推荐

