C++ 计算欧拉';以C++;

C++ 计算欧拉';以C++;,c++,math,eulers-number,C++,Math,Eulers Number,编写一个计算欧拉数e的程序。为此,首先编写一个接受参数n的函数,并返回结果(1+1/n)n。当n接近无穷大时,该函数的极限接近e。在主程序中,编写一个循环,以递增的n值调用此函数。在每次迭代中,将n乘以2(如果每次仅将1与n相加,则算法将不起作用),并在新近似值与先前近似值相差小于1e-8时停止。现在你有了一个很好的估计。因此,在main()中,打印最佳近似值和生成它的数字n 在for循环之前,我已经做了所有的事情。我不太明白在新的和以前的数字大致相同之后,我应该如何停止循环 以下是我的功能:

编写一个计算欧拉数e的程序。为此,首先编写一个接受参数n的函数,并返回结果(1+1/n)n。当n接近无穷大时,该函数的极限接近e。在主程序中,编写一个循环,以递增的n值调用此函数。在每次迭代中,将n乘以2(如果每次仅将1与n相加,则算法将不起作用),并在新近似值与先前近似值相差小于1e-8时停止。现在你有了一个很好的估计。因此,在main()中,打印最佳近似值和生成它的数字n

在for循环之前,我已经做了所有的事情。我不太明白在新的和以前的数字大致相同之后,我应该如何停止循环

以下是我的功能:

double euler_finder(double n)
{
    return pow((1+1/n), n);
}
这是我在主方法中的for循环,在哪里???这就是我遇到的问题:

for (int i=0; i<????; i*=2) {

}

它并没有说要使用for循环。你可以,虽然我考虑一段时间或做更多的可读性。无论哪种情况,您都需要以下条件:

while(abs(prevValue - value) >= threshold)
编辑:修正。严格来说,它应该是
=

编辑2:您可以从人工的
prevValue
value
开始,例如0和1,或者使用do while(如上所述)


首先,如果我从0开始,你继续乘以2,它不会前进太远。1点出发


其次,根据问题陈述,当你的近似值足够好时,你应该停止。因此,循环停止条件不是在i上,而是在abs(适当的E-你的近似值)>1e-8

不要忘记有多个循环结构可用;对于这个特定的算法,循环可能是更好的选择。(是的,我确信您可以将其放入
for
循环中,但它可能读得不太清楚。)

我不同意-这需要初始化、结束条件和增量(即使是乘法。)这使得
for
成为最佳选择。@glowcoder,但您的答案忽略了结束条件(潜在的巨大计算成本)在你的
for
-循环回答中。@sarnold我的主要目的是说明
for
循环不仅仅是
int
s,这是非常常见的误解。当我意识到我的错误时,我进行了编辑(实际上是在你的评论之前)。这个答案立即中断,因为初始值都是0,低于阈值。@Tomalak,什么?我在哪里说过
prevValue
是0?通过人为地将循环设置为1,很容易使其工作。或者,您可以使用do-while,这是我在您的评论之前说过的。(1)for循环中的条件可以是您想要的任何东西(在每次迭代中都有效),它不必是
I
。在这种情况下,您希望检查当前估计值和以前估计值之间的差异,因此在前2次迭代时要非常小心。(2) 对于,除了
,还有其他类型的循环。A
做。。。在这种情况下,while
可能不是一种改进,但可能是用于下一次作业。实际上,刚刚注意到,您必须打印生成最后近似值的n值,因此while循环之一可能是一个好主意。当计算
e
的值时,我们不应该根据已知的值来检查误差:),而应该根据连续迭代之间的差异来检查。@sarnold:有一些序列极限定理可以将相邻项的差异与极限的差异联系起来。您可以使用其中一个,并知道精度的界限。实际上,循环条件将表示
>=1e-8
。你想让它停下来,然后
<1e-8
@Tomalak我反对用“=”来表示双倍:)@iluxa:with
,如果双倍值
1e-8
略大于真值1e-8(在我的实现中),那么你得到的两个值正好是
1e-8
(双倍值),然后你提前退出,至少根据问题中的说明,估计不够准确。当然,如果发生这种情况,你无论如何都会面临
pow
的准确度限制,因此你可以合理地争论它是否重要,但如果你不知道
1e-8
的值,你就必须要么冒险一步走得太远,或者冒险走得不够远。
4 2.25
8 2.44141
16 2.56578
32 2.63793
64 2.67699
128 2.69734
256 2.70774
512 2.71299
1024 2.71563
2048 2.71696
4096 2.71762
8192 2.71795
16384 2.71812
32768 2.7182
65536 2.71824
131072 2.71826
262144 2.71827
524288 2.71828
1048576 2.71828
2097152 2.71828
4194304 2.71828
8388608 2.71828
16777216 2.71828
33554432 2.71828
67108864 2.71828
134217728 2.71828
e is approximately 2.7182818 and we got it with a value of 268435456 for n
while(abs(prevValue - value) >= threshold)
do
{
  // ...
} while(abs(prevValue - value) >= threshold);