Java无内置函数计算e^x:自定义代码错误原因问询
你的代码逻辑错在哪?
咱们先回到泰勒展开的本质:$e^x = 1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} + \frac{x^4}{4!} + ...$,每一项都是前一项乘以 $\frac{x}{n}$(n是当前项的阶数,比如第3项$\frac{x^2}{2!}$是第2项$x$乘以$\frac{x}{2}$)。
你的代码核心错误
看你写的这行关键代码:
sum = sum + (sum * (x / (j)));
这里的sum你本来想用来存累加的总和,但你用总和去乘$\frac{x}{j}$再加回总和,这完全偏离了泰勒展开的递推逻辑。举个具体例子,当x=1时:
- 初始sum设为x=1,第一次循环j从1变到2,sum变成$1 + 1*(1/2) = 1.5$
- 第二次循环j=3,sum变成$1.5 + 1.5*(1/3) = 2.0$,但泰勒展开前三项的正确和应该是$1+1+\frac{1}{2}=2.5$,明显对不上
问题就在于:你把累加总和和当前项混在了一个变量里,用总和去计算下一项,相当于每次都把之前所有的项都放大了$\frac{x}{j}$倍再加回去,这不是在计算新的单项,而是在错误地叠加旧总和的倍数,自然得不到正确结果。
参考代码为什么正确
参考代码的聪明之处在于把当前项和累加总和拆成了两个独立变量:
double sum = x; // 这里sum存的是当前要加的项(初始是第二项x) double result = 1.0; // result存的是累加的总和(初始是第一项1)
然后每次循环严格遵循泰勒展开规则:
- 用当前项
sum乘以$\frac{x}{j}$,得到下一个单项(比如x*(x/2)=x²/2,x²/2*(x/3)=x³/6) - 把这个新的单项加到
result里,更新总和
这样每一步都精准计算新项并累加,自然能得到正确的结果。
给你修正后的清晰版本
我把代码改得更直观,用for循环代替while,变量名也更易懂:
public static void myexp(double x, int termCount) { // result:累加的总和,初始是泰勒展开的第一项1 double result = 1.0; // currentTerm:当前要加的项,初始为1,第一次循环会变成x(第二项) double currentTerm = 1.0; for (int n = 1; n <= termCount; n++) { // 递推计算下一项:前一项 * x / n currentTerm = currentTerm * x / n; // 把当前项加到总和里 result += currentTerm; System.out.println("计算到第" + (n+1) + "项的结果:" + result); } } public static void main(String[] args) { double x = 1; // 计算前6项(1 + x + x²/2! + ... + x^5/5!) int termCount = 5; myexp(x, termCount); }
运行这个代码,你会看到结果一步步逼近e≈2.71828,完全符合预期。
内容的提问来源于stack exchange,提问作者brosefzai
相关产品推荐
相关产品推荐

