计算e的近似值 代码解读

时间:2021-11-21 18:36:14

这是一段不知出处的源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include<iostream>
using  namespace  std;
 
int  main() {
     int  N = 3;
     int  a[ 1000 ] = { 0 };      //定义一个数组
     int  s = 1;
     for  int  n = N; n >= 1; n-- )
     {
         int  r = s%n;
         s = s / n + 1;
         int  i = 0;
         for  ( ; i<N; i++ )
         {
             r = r * 10 + a[ i ];
             a[ i ] = r / n;
             r %= n;
         }
         for  ( i = N - 1; i>0; i-- )
         {
             a[ i - 1 ] += a[ i ] / 10;
             a[ i ] %= 10;
         }
         s += a[ 0 ] / 10;
         a[ 0 ] %= 10;
     }
     cout << s <<  "." ;
     for  int  i = 0; i < N; i++ )
     {
         cout << a[ i ];
     }
     cout << endl;
     system "pause"  );
     return  0;
}


     这个算法是用来计算自然对数e的近似值,结果存在一个内存数组里。数学思想是基于欧拉1748年把牛顿的二项式定理改进的一个公式(3)

计算e的近似值 代码解读

    这个公式使得欧拉把e精确到23位小数点。受欧拉公式的启发,衍生出来很多变种。其中的一个变种是

计算e的近似值 代码解读

    本算法就是对(4)公式的翻译。第一个外循环是累乘计算(4)式的每一个括号项。当k足够大的时候,式子的...≈0,所以可以初始化为s=1.第一个内循环是计算(1+r)/k,把每一位小数存入相应的数组位置里。由于每一次内循环都会往各个小数位上加上一定的商,所以会超过10,于是要把他放到前一位里面,这便是第二位做的事情。


    还有很多计算e的高效算法,请参见参考资料。

    参考资料:

  1. http://numbers.computation.free.fr/Constants/E/e.html#eSeries

  2. http://numbers.computation.free.fr/Constants/TinyPrograms/tinycodes.html#tth_sEc2

  3. http://*.com/questions/3028282/an-efficient-way-to-compute-mathematical-constant-e

  4. http://codereview.stackexchange.com/questions/33015/why-is-my-c-program-for-calculating-eulers-constant-of-poor-quality/33019#33019