package com.beiguiyan.demo;

public class Demo6 {

public static void main(String[] args) {

System.out.println(exp(1.2));

System.out.println(expP(1.2));

System.out.println(Math.exp(1.2));

}

private static double sqrt(double db)

{

double new_guess=0;

double last_guess=0;

if (db < 0)

{

return -1;

}

new_guess = 1;

do

{

last_guess = new_guess;

new_guess = (last_guess + db / last_guess) / 2;

}while (new_guess != last_guess);

return new_guess;

}

private static double exp(double x){

int i,k,m,t;

int xm=(int)x;

double sum;

double e ;

double ef;

double z ;

double sub=x-xm;

m=1;      //阶乘算法分母

e=1.0;  //e的xm

ef=1.0;

t=10;      //算法精度

z=1;  //分子初始化

sum=1;

if (xm<0) {     //判断xm是否大于0？

xm=(-xm);

for(k=0;k<xm;k++){ef*=Math.E;}

e/=ef;

}

else { for(k=0;k<xm;k++){e*=Math.E;} }

for(i=1;i<t;i++){

m*=i;

z*=sub;

sum+=z/m;

}

return sum*e;

}

static double expP(double x)//计算e^x,实现系统的exp()功能

{

if(x==0) return 1;

if(x<0) return 1/expP(-x);

double y=x,ex_p1=0,ex_p2=0,ex_p3=0,ex_p=0,ex_px=0,ex_tmp=1,dex_px=1,tmp;

int l;

for(l=1,tmp=1;((ex_px-ex_tmp)>1e-10 || (ex_px-ex_tmp)<-1e-10) && dex_px>1e-10;l++)

{

ex_tmp=ex_px;

tmp*=y;

tmp=tmp/l;

ex_p1+=tmp;

ex_p2=ex_p1+tmp*y/(l+1);

ex_p3=ex_p2+tmp*y*y/(l+1)/(l+2);

dex_px=ex_p3-ex_p2;

ex_px=ex_p3-dex_px*dex_px/(ex_p3-2*ex_p2+ex_p1);

}

return ex_px+1;

}

}