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

C语言余弦级数实现精度丢失问题求助

问题排查与修复

你的代码存在多处关键错误,直接导致计算结果偏差,逐一说明并修正:

核心错误点

  • cos函数初始值完全错误:级数公式的第一项是1,但你把result初始化为角度转弧度的值,还将这个错误值代入后续幂运算,等于在计算cos(cos(x))的级数,完全偏离需求。
  • 阶乘函数逻辑与类型问题:数学上0! = 1,但你的代码返回0;用float存储阶乘会快速丢失精度(比如10!之后float就无法精准存储),应改用double或整数类型。
  • 输入单位处理矛盾:任务明确要求输入为弧度,但你在代码里额外做了一次角度转弧度操作,等于把弧度值再缩小了π/180倍,完全错误。
  • 级数项计算低效且易累积误差:每次调用power函数重复计算x的i次方,会多次累积浮点误差,应该用递推方式生成每一项。

修复后的代码

#include "stdio.h"
#include "stdint.h"
#include "math.h"

// 用double计算阶乘,避免精度丢失
double factorial(uint32_t number) {
    double result = 1;
    for (uint32_t i = 1; i <= number; ++i) {
        result *= i;
    }
    return result;
}

// 按级数计算cos(x),x为弧度(符合任务要求)
double cos_rad(double x) {
    double result = 1.0; // 级数起始项为1
    double current_term = 1.0;
    int sign = -1;

    // 递推计算每一项,直到项的绝对值小到不影响精度
    for (uint32_t i = 2; ; i += 2) {
        // 递推式:当前项 = 前一项 * x²/(i*(i-1)),等价于x^i/i! = x^(i-2)/(i-2)! * x²/(i*(i-1))
        current_term *= x * x / (i * (i - 1));
        if (current_term < 1e-12) { // 精度阈值,可按需调整
            break;
        }
        result += sign * current_term;
        sign *= -1;
    }

    return result;
}

int main(void) {
    double realNumber = 0;
    double result = 0;

    scanf("%lf", &realNumber);

    // 若实际需求为输入角度,打开下方注释:
    // realNumber = realNumber * M_PI / 180.0;

    result = cos_rad(realNumber);

    printf("%.13f", result);
    return 0;
}

额外说明

你提到输入60时正确结果是0.5,这说明你实际是将60当成了角度,但任务要求输入为弧度。如果是这种场景,打开main函数里的角度转弧度注释即可,此时输入60会输出0.5000000000000,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 09:35:35