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
相关产品推荐
相关产品推荐

