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

基于泰勒级数计算任意x的e^x的C代码无法运行的原因排查

问题原因

  • 浮点数直接判等逻辑错误:C语言中浮点数(float/double)由于存储精度限制,理论值相等的两个浮点数实际存储时可能存在极小的尾数位差异,直接使用==或!=判断相等逻辑非常不可靠。即使计算逻辑无错,这个判断条件要么会提前终止循环,要么会陷入死循环。
  • 函数参数类型缺失:fak函数的参数k没有声明类型,C99及之后的标准已经废除了默认隐式int的规则,不符合语法规范,不同编译器处理时可能出现不可预期的行为。
  • 计数器变量类型误用:e_hoch函数中的循环计数器k被定义为double类型,计数器属于整型计数场景,使用浮点数会增加自增、比较环节的异常风险。
  • 重复计算易引发溢出:每次循环都重新调用pow(x,k)和fak(k)计算当前项,当k增大到一定值时,阶乘会先超出double的数值范围变成无穷大,导致后续计算完全错误。

修正方案

推荐用递推方式计算每一项,既提升效率也能避免阶乘提前溢出,同时用精度阈值替代浮点数直接判等,修正后代码如下:

#include <stdio.h>

double e_hoch (double x){
    // 计算精度阈值,可根据需求调整
    const double eps = 1e-15;
    double haufen = 0.0;
    // 初始项为k=0时的x^0/0! = 1
    double term = 1.0;
    int k = 0;
    do{
        haufen += term;
        k++;
        // 递推计算下一项:x^(k)/k! = x^(k-1)/(k-1)! * x /k
        term = term * x / k;
    // 项的绝对值小于精度阈值时停止迭代
    }while(term > eps || term < -eps);
    return haufen;
}

int main (void){
    double x_main;
    printf("x=");
    scanf("%lf", &x_main);
    printf("e^%.2f = %.10f\n",x_main, e_hoch(x_main));
    return 0;
}

补充说明

如果要保留你原本的haufen和haufen_alt比较逻辑,可将循环条件修改为判断差值小于极小阈值:while(fabs(haufen - haufen_alt) > 1e-15),该方案需要引入math.h头文件调用fabs函数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 17:24:07