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

余弦函数(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", &deg);
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 08:35:24