基于泰勒级数计算任意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
相关产品推荐
相关产品推荐

