program esponenziale
  ! Il programma approssima il valore di exp(x) tramite
  ! il polinomio di Taylor p(n,x), con i due algoritmi
  ! exp(x)~=p(n,x) e exp(x)~=1/p(n,-x) e fa i confronti
  implicit none

  real(8) :: x,e1,e2,err1,err2,taylor
  integer :: k,n=500
  
  do  ! Ciclo infinito, esci se x==0   
     write(*,'(a)',advance='no') "Inserisci il valore di x (0 per uscire) "
     read (*,*) x
     if (x==0) exit 

     ! Calcolo un'approssimazione di exp(x)
     e1=taylor(n,x)
     err1=abs(exp(x)-e1)/exp(x)

     ! Calcolo un'approssimazione di 1/exp(-x)
     e2=1/taylor(n,-x)
     err2=abs(exp(x)-e2)/exp(x)
  
     write(*,*) "Algoritmo 1. exp(x) =",e1,"Errore =",err1
     write(*,*) "Algoritmo 2. exp(x) =",e2,"Errore =",err2
  end do
     
end program esponenziale

function taylor (n,x)
  implicit none
  
  real(8) :: taylor,x
  integer :: n
  
  real(8) :: s,s1,a
  integer :: k
  
  s=0.0d0;a=1.0d0
  do k=1,n
     if (k==n) write(*,*) "Attenzione! ",n," non bastano"

     s1=s+a
     if (s1==s) exit
     a=a*x/k
     s=s1
  end do
  
  taylor=s
end function taylor
