      double precision function dfac (n)
c june 1977 edition.   w. fullerton, c3, los alamos scientific lab.
      double precision facn(31), sq2pil, x, xmax, xmin,  d9lgmc,
     1  dexp, dlog
      external d9lgmc, dexp, dlog
c
      data facn  (  1) / +.1000000000 0000000000 0000000000 000 d+1    /
      data facn  (  2) / +.1000000000 0000000000 0000000000 000 d+1    /
      data facn  (  3) / +.2000000000 0000000000 0000000000 000 d+1    /
      data facn  (  4) / +.6000000000 0000000000 0000000000 000 d+1    /
      data facn  (  5) / +.2400000000 0000000000 0000000000 000 d+2    /
      data facn  (  6) / +.1200000000 0000000000 0000000000 000 d+3    /
      data facn  (  7) / +.7200000000 0000000000 0000000000 000 d+3    /
      data facn  (  8) / +.5040000000 0000000000 0000000000 000 d+4    /
      data facn  (  9) / +.4032000000 0000000000 0000000000 000 d+5    /
      data facn  ( 10) / +.3628800000 0000000000 0000000000 000 d+6    /
      data facn  ( 11) / +.3628800000 0000000000 0000000000 000 d+7    /
      data facn  ( 12) / +.3991680000 0000000000 0000000000 000 d+8    /
      data facn  ( 13) / +.4790016000 0000000000 0000000000 000 d+9    /
      data facn  ( 14) / +.6227020800 0000000000 0000000000 000 d+10   /
      data facn  ( 15) / +.8717829120 0000000000 0000000000 000 d+11   /
      data facn  ( 16) / +.1307674368 0000000000 0000000000 000 d+13   /
      data facn  ( 17) / +.2092278988 8000000000 0000000000 000 d+14   /
      data facn  ( 18) / +.3556874280 9600000000 0000000000 000 d+15   /
      data facn  ( 19) / +.6402373705 7280000000 0000000000 000 d+16   /
      data facn  ( 20) / +.1216451004 0883200000 0000000000 000 d+18   /
      data facn  ( 21) / +.2432902008 1766400000 0000000000 000 d+19   /
      data facn  ( 22) / +.5109094217 1709440000 0000000000 000 d+20   /
      data facn  ( 23) / +.1124000727 7776076800 0000000000 000 d+22   /
      data facn  ( 24) / +.2585201673 8884976640 0000000000 000 d+23   /
      data facn  ( 25) / +.6204484017 3323943936 0000000000 000 d+24   /
      data facn  ( 26) / +.1551121004 3330985984 0000000000 000 d+26   /
      data facn  ( 27) / +.4032914611 2660563558 4000000000 000 d+27   /
      data facn  ( 28) / +.1088886945 0418352160 7680000000 000 d+29   /
      data facn  ( 29) / +.3048883446 1171386050 1504000000 000 d+30   /
      data facn  ( 30) / +.8841761993 7397019545 4361600000 000 d+31   /
      data facn  ( 31) / +.2652528598 1219105863 6308480000 000 d+33   /
c
      data sq2pil / 0.9189385332 0467274178 0329736405 62 d0 /
      data nmax / 0 /
c
      if (nmax.ne.0) go to 10
      call d9gaml (xmin, xmax)
      nmax = xmax - 1.d0
c
 10   if (n.lt.0) call seteru (
     1  47hdfac    factorial of negative integer undefined, 47, 1, 2)
c
      if (n.le.30) dfac = facn(n+1)
      if (n.le.30) return
c
      if (n.gt.nmax) call seteru (
     1  39hdfac    n so big factorial(n) overflows, 39, 2, 2)
c
      x = n + 1
      dfac = dexp ((x-0.5d0)*dlog(x) - x + sq2pil + d9lgmc(x) )
c
      return
      end