关于自然底数E的计算

对于数列{ ( 1 + 1/n )^n },
当n趋于正无穷时该数列所取得的极限就是e,即e = lim (1+1/n)^n。
通过二项式展开,取其部分和,可得e的近似计算式
e = 1 + 1 + 1/2! + 1/3! + 1/4! + ... + 1/n!,n越大,越接近的真值,要求到最后一项小于1e-5为止。
P.S. e ≈ 2.71828 18284 59045 23536 02874 71352 66249 77572 47093 69995 95749 66967 62772 40766 30353 54759 45713 82178 52516 64274 27466 39193 20030 59921 81741 35966 29043 57290 03342 95260 59563 07381 32328 62794 34907 63233 82988 07531 95251 01901 15738 34187 93070 21540 89149 93488 41675 09244 76146 06680 82264 80016 84774 11853 74234 54424 37107 53907 77449 92069 55170 27618 38606 26133 13845 83000 75204 49338 26560 29760 67371 13200 70932 87091 27443 74704 72306 96977 20931 01416 92836 81902 55151 08657 46377 21112 52389 78442 50569 53696 77078 54499 69967 94686 44549 05987 93163 68892 30098 79312 77361 78215 42499 92295 76351 48220 82698 95193 66803 31825 28869 39849 64651 05820 93923 98294 88793 32036 25094 43117 30123 81970 68416 14039 70198 37679 32068 32823 76464 80429 53118 02328 78250 98194 55815 30175 67173 61332 06981 12509 96181 88159 30416 90351 59888 85193 45807 27386 67385 89422 87922 84998 92086 80582 57492 79610 48419 84443 63463 24496 84875 60233 62482 70419 78623 20900 21609 90235 30436 99418 49146 31409 34317 38143 64054 62531 52096 18369 08887 07016 76839 64243 78140 59271 45635 49061 30310 72085 10383 75051 01157 47704 17189 86106 87396 96552 12671 54688 95703 50354 (取1000位)
 
基于以上理论知识:我们来合适JAVA语言计算一下:为了使结果更加接近实际结果,我们使N=10000000;
第一类计算方法,使用( 1 + 1/n )^n:
    public static double cu(int n) {
        double r = (1 + (double) 1 / n);
        double re = r;
        for (int i = 0; i < n; i++) {
            r *= re;
            
        }
        System.out.println(r);
        return r;
    }

2.71828196596018

第一类计算方法优化:
 
public static double way2(){
        int n = 10000000;
        double r = (1 + (double) 1 / n);
        double re = r;
        for(int i = 0;i<n/1000;i++){
            r *= re;
        }
        System.out.println(r);
        re = r;
        for(int i = 0;i<1000;i++){
            r *= re;
        }
        System.out.println(r);
        return r;
    }

1.001000600217293
2.7212737211393243

第一类计算方法优化:
package thread.trainee;

public class NaturalBaseE {

    public static double result = 1;
    public static void main(String[] args) {
        final int n = 10000000;
        for (int i = 0; i < 1000; i++) {
            new Thread(){
                @Override
                public void run() {
                    double r = NaturalBaseE.cu(n, n/1000, this.getName());
                    NaturalBaseE.result *= r;
                    System.out.println(result);
                }
            }.start();
        }

    }

    public static double cu(int n, int time, String name) {
        double r = (1 + (double) 1 / n);
        double re = r;
        for (int i = 0; i < time; i++) {
            r *= re;
            
        }
        System.out.println(name + ":" + r);
        return r;
    }

}

2.7185535358805994

其中优化方案从某种角度上减少了程序运行的时间,但是这个例子中,确影响了计算的准备性,这里做为学习,仅仅考虑计算的方法;

第二类计算方法,使用e = 1 + 1 + 1/2! + 1/3! + 1/4! + ... + 1/n!:

public static void way1(){
        int n = 10000000;
        double result = 1;
        abc:for(int i = 1;i<=n;i++){
            double temp = 1;
            for(int j=1;j<=i;j++){
                temp *= (double)1/j;
            }
            System.out.println(temp);
            result += temp;
        }
        System.out.println(result);
    }

由于java的精确度的关系,大概运行1000次内,就能得到结果,因为之后加上去的都是0了结果是:

2.7182818284590455

否则还会运行很久,总之这种方法时间挺长的;乘法次数为:(1+10000000)*10000000/2次;

第二类计算方法优化:

    public static void way2(){
        int n = 10000000;
        double result = 1;
        double temp = 1;
        for(int i = 1;i<=n;i++){
            result += temp *= (double)1/i;
            /*if(i > 1000){
                break;
            }*/
        }
        System.out.println("result: " + result);
    }

结果也是:

result: 2.7182818284590455

但是这种的乘法运算次数为:10000000;

 


 

 
posted @ 2014-02-17 14:39 roilat 阅读(...) 评论(...)  编辑 收藏