e,和圆周率π一样,是数学中一个重要的常数。
它的其中一个定义是这样的:
其数值约为(小数点后100位):“e ≈ 2.71828 18284 59045 23536 02874 71352 66249 77572 47093 69995 95749 66967 62772 40766 30353 54759 45713 82178 52516 64274”。
融合e,π的最完美的欧拉公式
也备受数学家们的推崇,它是超越数e的数学价值的最高体现。
但这个定义公式若用来计算e则因收敛太慢且因为涉及小数的高次幂容易产生误差。
我们在用Excel试算时也证明了这一点。如下表:
| n | An=(1+1/n)^n |
| 1 | 2 |
| 10 | 2.59374246 |
| 100 | 2.704813829 |
| 1000 | 2.716923932 |
| 10000 | 2.718145927 |
| 100000 | 2.718268237 |
| 1000000 | 2.718280469 |
| 10000000 | 2.718281694 |
| 100000000 | 2.718281798 |
| 1000000000 | 2.718282052 |
| 10000000000 | 2.718282053 |
| 100000000000 | 2.718282053 |
人们在研究微积分时发现公式:
由此就可根据上式求解出e的具体数值。
以下我们用Excel来试算。以下是演算结果:
| n | An |
| 0 | 1.000000000 |
| 1 | 1.000000000 |
| 2 | 0.500000000 |
| 3 | 0.166666667 |
| 4 | 0.041666667 |
| 5 | 0.008333333 |
| 6 | 0.001388889 |
| 7 | 0.000198413 |
| 8 | 0.000024802 |
| 9 | 0.000002756 |
| 10 | 0.000000276 |
| 11 | 0.000000025 |
| 12 | 0.000000002 |
| 13 | 0.000000000 |
| ∑ | 2.718281828 |
从表中我们看出,这个公式计算收敛很快,才计算13项就已经得出小数点后9位的准确数值。
那么如果要计算e的更多位数的准确数值,怎么计算呢?
比如我们要求e的小数点后1000位的准确数值该怎么算?
其实很简单,多算几项呗,计算到某项为0即可停止,然后把各项相加就可以了。
以下这段简洁高效的Delph源程序可以用来计算e值精确到小数点后1000位。
其中使用到了高精度运算的一些技巧,值得观摩。
用Delphi新建一个工程,在Form1上放一个Memo1和一个Button1, 在Button1 的 OnClick 事件写:
procedure TForm1.Button1Click(Sender: TObject);
const
nSize: integer=1002;
deNum: integer=1000;
var
x,z: array[0..1002] of byte;
i,b,c,d,Run,Cnt: integer;
s: String;
t0: TDateTime;
t: double;
begin
t0 := Now();
b:=1; Run:=1; Cnt:=0;
for i:=0 to nSize do begin
x[i]:=0; z[i]:=0;
end;
x[1]:=1; z[1]:=1;
while (Run>0) and (Cnt<100000000) do
begin
//z:=z/b;
d := 0;
for i:=0 to nSize-1 do
begin
c := z[i]+d*10;
z[i] := c div b;
d := c mod b;
end;
//x:=x+z;
Run := 0;
for i:=nSize-1 downto 0 do
begin
c := x[i] + z[i];
x[i] := c mod 10;
x[i-1] := x[i-1]+ c div 10;
Run :=Run or z[i];
end;
b:=b+1;
Cnt:=Cnt+1;
end;
t := 86400.0*(Now()-t0);
s:=Format('计算次数:%d次'#13#10+'计算时间:%.3f秒'#13#10,[Cnt,t])
+Format('e=%d%d.'#13#10, [x[0],x[1]]);
for i:=0 to deNum-1 do
begin
if (i>0) and ((i mod 100)=0) then s := s+#13#10;
s := s+ inttostr(x[i+2]);
end;
Memo1.Text := s;
end;
编译运行再点按钮Button1,稍侯即可在Memo1显示计算结果。
有兴趣者不妨一试。
.
【转载声明】本号发表之文章皆是作者原创,版权皆为作者所有。所以转载前请务必通知作者并以超链接形式注明内容来自本站,以免带来不必要的麻烦。
本号内容欢迎分享,但拒绝有商业目的的转载!
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.