PROGRAM stirling
C------------------------------------------------------------------------
C STIRLING2.FOR
C Program to test the accuracy of Stirling's approximation.
C The formula is:
C n! = [sqrt(2*pi*n)][(n/e)**n]
C Form given by Stephenson (p.241) is
C ln(n!) ~ 0.5*ln(2*pi)-n+(n+0.5)*ln(n)
C
C The output is n; approx. ln(n!); ln(n!); error ratio; ln(gamma(n-1))
C------------------------------------------------------------------------
REAL*8 DKLN10
PARAMETER(DKLN10 = 2.30258509299D0) ! A & S p.274
REAL*8 DK2PI
PARAMETER(DK2PI = 6.28318530718D0) ! A & S p.3
INTEGER*4 nn, jj, jline
REAL*8 lnnfac, lnstirl, xx, rnn
INTEGER*4 ICHAN1, OCHAN1, NLINEMAX
PARAMETER(ICHAN1 = 11)
PARAMETER(OCHAN1 = 12)
PARAMETER(NLINEMAX = 100)
CHARACTER*12 strfile1, strfile2
REAL*8 asgamm(1:NLINEMAX), ferr, f5
strfile1 = 'A.S.p274.txt' ! Abramovich & Stegun, p.274.
strfile2 = 'STIRLING.txt'
OPEN(ICHAN1, FILE=strfile1, ERR=80, STATUS='OLD')
DO 10 jline = 1, NLINEMAX
! using free-format READ seems to chop the data at each
! item of whitespace, so tabs are okay...
READ(ICHAN1, *, END=12) nn, asgamm(jline)
10 CONTINUE
12 jj = 0
CLOSE(ICHAN1)
OPEN(OCHAN1, FILE=strfile2, ERR=80, STATUS='UNKNOWN')
lnnfac = 0.D0
xx = 0.D0
ferr = 0.D0 ! skip ferr, f5 for n = 1
f5 = 0.D0
WRITE(6, *) ' n Stirling n!'
& //' frac. error A. & S.'
WRITE(OCHAN1, *) ' n Stirling n!'
& //' frac. error A. & S.'
DO 20 nn = 1, 50
rnn = DFLOAT(nn)
xx = DLOG(rnn)
lnnfac = lnnfac+xx
lnstirl = DLOG(DK2PI)/2.D0-rnn+(rnn+0.5D0)*xx
IF( nn .GT. 1 ) THEN
ferr = lnstirl/lnnfac-1.D0
f5 = DKLN10*asgamm(nn+1)
ENDIF
WRITE(6, 90) nn, lnstirl, lnnfac, ferr, f5
WRITE(OCHAN1, 90) nn, lnstirl, lnnfac, ferr, f5
! prettify the output...
jj = jj+1
IF( jj .EQ. 10 ) THEN
jj = 0
WRITE(6, *)
ENDIF
20 CONTINUE
CLOSE(OCHAN1)
80 STOP
90 FORMAT(I4, 4(F15.9))
END