计算(1+1/n)^n的极限

  • 本文关键字:极限 计算 c
  • 更新时间 :
  • 英文 :


我必须编写一个程序来计算(1+1/n)n的极限(当n趋于无穷时),精度为epsilon。以下是我尝试过的:

#include <stdio.h>
#include <math.h>
int main() {
int i = 1;
double e = exp(1), eps, t = 1;
scanf("%lf", eps);
while ((e - t) > eps) {
t = pow(1 + (1 / (float)i), i);
i++;
}
printf("%lf", t);
}

对于输入0.001,输出应该是2.682435,但是这个程序不打印任何东西。我是C语言的初学者,我不明白为什么这不起作用,这快把我逼疯了。

编辑:我意识到这是因为我忘记在scanf中添加&号,但是程序输出了错误的数字,它显示的是2.717296而不是2.682435

关于结果值之间的差异:您正在将当前值与期望值进行比较,实际上,您无法知道,因为练习的目的是计算它。

相反,您的epsilon是前一个值与当前值之间的差值:这些值以不断减小的间隔接近e。当差异足够小时,stop:

#include <stdio.h>
#include <math.h>
int main(void)
{
double eps = 0.001;
double t = 2.0;
int i = 2;

for (;;) {
double tprev = t;

t = pow(1.0 + (1.0 / i), i);

if (fabs(tprev - t) < eps) break;
i++;
}
printf("%d: %fn", i, t);
}

这将产生值2.682435。(当然,你可以尝试几个epsilons,看看与实际的e的相对误差有多大。)

(这是提供额外信息的补充回答)

对于计算极限与极限的实值(e)之间的不准确性,这是因为pow(1+1/(double)i, i)表达式随着i的增大而变得越来越不准确,所以慢慢收敛到错误的值。随着i的增加,1+1/(double)i部分的精度会稍微降低,而将不准确值提高到i的幂会放大不准确。

由于当n趋于正无穷时(1+1/n)n的极限已知为欧拉数e,使用1/n求和的无穷级数可以更精确地计算出极限!n的值从0到无穷大。这个序列的收敛速度比(1+1/n)n序列的连续成员要快得多。

示例实现如下:

#include<stdio.h>
#include<math.h>
int main(void)
{
int i=0;
double eps,t=1,f=1,pre;
scanf("%lf", &eps);
do
{
i++;
pre=t;
f/=i;
t+=f;
printf("%d: (%.29lf) %.29lfn",i, f, t);
} while (fabs(t-pre)>eps);
printf("nFinal result: %.29lfn",t);
printf("nDifference from previous result: %.29lfn", fabs(pre-t));
printf("Difference from Euler's number e: %.29lfn", fabs(M_E - t));
printf("(Euler's number e: %.29lf)n", M_E);
}

输入为0.001时运行:

1: (1.00000000000000000000000000000) 2.00000000000000000000000000000
2: (0.50000000000000000000000000000) 2.50000000000000000000000000000
3: (0.16666666666666665741480812812) 2.66666666666666651863693004998
4: (0.04166666666666666435370203203) 2.70833333333333303727386009996
5: (0.00833333333333333321768510160) 2.71666666666666634100124610995
6: (0.00138888888888888894189432843) 2.71805555555555544700041536998
7: (0.00019841269841269841252631712) 2.71825396825396836675281520002
Final result: 2.71825396825396836675281520002
Difference from previous result: 0.00019841269841291975239983003
Difference from Euler's number e: 0.00002786020507672404278309841
(Euler's number e: 2.71828182845904509079559829843)

输入为0时运行:

1: (1.00000000000000000000000000000) 2.00000000000000000000000000000
2: (0.50000000000000000000000000000) 2.50000000000000000000000000000
3: (0.16666666666666665741480812812) 2.66666666666666651863693004998
4: (0.04166666666666666435370203203) 2.70833333333333303727386009996
5: (0.00833333333333333321768510160) 2.71666666666666634100124610995
6: (0.00138888888888888894189432843) 2.71805555555555544700041536998
7: (0.00019841269841269841252631712) 2.71825396825396836675281520002
8: (0.00002480158730158730156578964) 2.71827876984127003723301641003
9: (0.00000275573192239858925109506) 2.71828152557319224769116772222
10: (0.00000027557319223985893569742) 2.71828180114638451314590383845
11: (0.00000002505210838544172022387) 2.71828182619849290091451621265
12: (0.00000000208767569878681001866) 2.71828182828616871091753637302
13: (0.00000000016059043836821615926) 2.71828182844675936280509631615
14: (0.00000000001147074559772972612) 2.71828182845823018709552343353
15: (0.00000000000076471637318198174) 2.71828182845899490871488524135
16: (0.00000000000004779477332387386) 2.71828182845904287034954904811
17: (0.00000000000000281145725434552) 2.71828182845904553488480814849
18: (0.00000000000000015619206968586) 2.71828182845904553488480814849
Final result: 2.71828182845904553488480814849
Difference from previous result: 0.00000000000000000000000000000
Difference from Euler's number e: 0.00000000000000044408920985006
(Euler's number e: 2.71828182845904509079559829843)

注意:"Euler's number e";在上面的输出中,实际上是可以在double中表示的最接近e的数字的值,打印到小数点后29位。e到小数点后29位的实际值略小:2.71828182845904523536028747135(与小数点后16位不同)。上面的程序在输入epsilon为0的情况下计算出的值实际上是double中可以表示的大于e的最小的数,打印到小数点后29位(从小数点后16位开始与e不同)。

Scanf需要指针,而不是实际的变量。所以你可能想参考eps的地址->,每股收益。我还建议在printf中添加n,用于添加新行。下面是一个例子

https://onlinegdb.com/KIHgtcb25

这是一个补充答案,提供了额外的信息,以显示先对最小项求和的轻微优势。

#include <stdio.h>
#include <math.h>
#ifndef M_E
#define M_E 2.7182818284590452353602874713527
#endif
double e_helper(double f, int i) {
if (1 + f == 1) {
return f;
}
i++;
return f + e_helper(f / i, i);
}
int main(void) {
printf("%.17f Machine en", M_E);
printf("%.17f Calculated en", e_helper(1.0, 0));
printf("2.71828182845904523 en");
printf("%.17f Machine e nextn", nextafter(M_E, 3));
}

输出
2.71828182845904509 Machine e
2.71828182845904509 Calculated e
2.71828182845904523 e
2.71828182845904553 Machine e next

最新更新