program TraceExponential                                  
!-----------------------------------------------------------------------
!Christina Urbanczyk             Lab5               February 16, 2010   
! This algorithm uses a factorial subprogram to calculate the &         
! approximate value of exp(x) using the infinite series.                
!    Variables used are:                                                
!    count: DO-loop control variable                                    
!    FactorialNum: function subprogram to calculate factorials          
!    X: User determined value to find infinite series of                
!    Numits:Number of iterations                                        
!    Countits: Count iterations                                         
!    Tol:Convergence criteria                                           
!    Esum:Sum of Exp(x)                                                 
!    Number:Subprogram variable                                         
!    FactorialNum:Factorial of integer                                  
!                                                                       
! Input:X,Tol,Numits                                                    
! Output:FactorialNum                                                   
!-----------------------------------------------------------------------

IMPLICIT NONE
integer,parameter::dp=selected_real_kind(15) !15 significant figures 
integer:: count, Numits,Countits                             
real(dp)::X, Esum, Tol                                               
character (len=1):: Method                                           

Esum=1

write(*,*) "Please enter a value that you would like to find the infinite series of:"
read(*,*) X

write(*,*) "Would you like to define the number of iterations (Y or N)?"
   read (*,*) Method
 IF (Method == "Y" .OR. Method== "y") THEN
   write (*,*) "What is your number of iterations?"
   read (*,*) Numits

!Display Trace Table
write (*,'(T1,A7,T20,A9,T43,A8,T58,A5,T73,A6/)') "Count","X^count","Count!","Esum","Exp(X)"
      DO count=1,Numits
          Esum= Esum+(x**count)/(real(FactorialNum(Count)))
       write(*,'(T1,I2,T7,F20.1,T30,F20.1,T51,F15.5,T67,F15.5)') count,X**count,FactorialNum(Count),Esum, exp(X)
      END DO
        write(*,*) "Given",Numits,"iterations, the estimated value is",Esum,"."
        write(*,*) "The estimated value had",abs(exp(X)-Esum)/exp(X)*100.0,"% error from the actual value of",exp(x)
   ELSE IF  (Method == "N" .OR. Method == "n") THEN
        write (*,*) "What is your convergence criteria?"
        read (*,*) Tol

!Display Trace Table
write (*,'(T1,A7,T20,A9,T40,A8,T58,A5,T73,A6/)') "Count","X^count","Count!","Esum","Exp(X)"
      DO count=1,Countits
      Esum= Esum+(x**count)/(real(FactorialNum(Count)))
      write(*,'(T1,I2,T7,F20.1,T30,F20.1,T51,F15.5,T67,F15.5)') count,X**count,FactorialNum(Count),Esum, exp(X)
      IF ((abs(exp(X)-Esum))<Tol) EXIT
      Countits=Countits+1
      END DO
        write(*,*) "Given a tolerance of",Tol,"it took",Countits,"iterations."
        write(*,*) "The estimated value had",abs(exp(X)-Esum)/exp(X)*100.0
        write(*,*) "% error from the actual value of",exp(x),"."
   ELSE
        write(*,*) "Please define iterations or convergence criteria."
   END IF


CONTAINS
 !--FactorialNum--------------------------------------------------------
 ! This program calculates the factorial Number! of Number which is 1 &
 ! if Number=0, 1*2*...*Number if Number>0.
 !
 ! Accepts:Number
 ! Returns:FactorialNum
 !----------------------------------------------------------------------
 FUNCTION FactorialNum (Number)
 Integer, INTENT (IN)::Number
 Integer::count
 real:: FactorialNum

 !Calculate FactorialNum
 FactorialNum=1
 DO count=2, Number
    FactorialNum=FactorialNum*count
 END DO

END FUNCTION FactorialNum


END