      double precision function dasin (x)
c may 1980 edition.   w. fullerton, c3, los alamos scientific lab.
      double precision x, asincs(39), pi2, sqeps, y, z, dcsevl,
     1  d1mach, dsqrt
      external d1mach, dcsevl, dsqrt, initds
c
c series for asin       on the interval  0.          to  5.00000e-01
c                                        with weighted error   1.62e-32
c                                         log weighted error  31.79
c                               significant figures required  30.67
c                                    decimal places required  32.59
c
      data asincs(  1) / +.1024639175 3227159336 5731483057 85 d+0     /
      data asincs(  2) / +.5494648722 1245833306 0111959029 24 d-1     /
      data asincs(  3) / +.4080630392 5449692851 3070561492 46 d-2     /
      data asincs(  4) / +.4078900685 4604435455 5988239056 12 d-3     /
      data asincs(  5) / +.4698536743 2203691616 0485301362 18 d-4     /
      data asincs(  6) / +.5880975813 9708058986 4543855520 74 d-5     /
      data asincs(  7) / +.7773231246 2777632750 5575281637 95 d-6     /
      data asincs(  8) / +.1067742334 0082039235 0475049565 87 d-6     /
      data asincs(  9) / +.1509239953 6022808262 3864344010 64 d-7     /
      data asincs( 10) / +.2180972408 0055385496 6096147139 30 d-8     /
      data asincs( 11) / +.3207598426 2789614433 2619596673 76 d-9     /
      data asincs( 12) / +.4785536964 6781034461 4931339189 53 d-10    /
      data asincs( 13) / +.7225128736 2910432263 8487545371 12 d-11    /
      data asincs( 14) / +.1101833474 2255783705 3727013349 87 d-11    /
      data asincs( 15) / +.1694763253 9203354877 4237456510 78 d-12    /
      data asincs( 16) / +.2626155866 7348224162 2832415024 16 d-13    /
      data asincs( 17) / +.4095829981 3281178408 8280692911 10 d-14    /
      data asincs( 18) / +.6424479310 8803655891 7279448870 91 d-15    /
      data asincs( 19) / +.1012814219 8228221693 9733612220 41 d-15    /
      data asincs( 20) / +.1603922189 7380787560 0505974647 46 d-16    /
      data asincs( 21) / +.2550350135 5807141715 2987896763 73 d-17    /
      data asincs( 22) / +.4070140379 7862382855 4871656721 06 d-18    /
      data asincs( 23) / +.6517267171 2881144437 8892675754 66 d-19    /
      data asincs( 24) / +.1046745303 7096796954 2448917162 66 d-19    /
      data asincs( 25) / +.1685872556 3380328094 9890951850 66 d-20    /
      data asincs( 26) / +.2722193630 5040227625 1643412479 99 d-21    /
      data asincs( 27) / +.4405929390 0347550617 1268300799 99 d-22    /
      data asincs( 28) / +.7146668524 3375937853 0631680000 00 d-23    /
      data asincs( 29) / +.1161579334 3859516051 7989717333 33 d-23    /
      data asincs( 30) / +.1891523455 2354685801 1841877333 33 d-24    /
      data asincs( 31) / +.3085577204 4244342399 8279680000 00 d-25    /
      data asincs( 32) / +.5041636602 2162453412 9704959999 99 d-26    /
      data asincs( 33) / +.8250272550 2400865081 7536000000 00 d-27    /
      data asincs( 34) / +.1352003263 1020947208 0554666666 66 d-27    /
      data asincs( 35) / +.2218432687 6541720216 6442666666 66 d-28    /
      data asincs( 36) / +.3644249405 4085079212 5781333333 33 d-29    /
      data asincs( 37) / +.5992021855 8643813307 7333333333 33 d-30    /
      data asincs( 38) / +.9858481205 9573785810 2613333333 33 d-31    /
      data asincs( 39) / +.1622250116 6399014393 1733333333 33 d-31    /
c
      data pi2 / 1.5707963267 9489661923 1321691639 75 d0 /
      data nterms, sqeps / 0, 0.d0 /
c
      if (nterms.ne.0) go to 10
      nterms = initds (asincs, 39, 0.1*sngl(d1mach(3)) )
      sqeps = dsqrt (6.d0*d1mach(3))
c
 10   y = dabs (x)
      if (y.gt.1.0d0) go to 20
c
      z = 0.d0
      if (y.gt.sqeps) z = y*y
      if (z.le.0.5d0) dasin = x*(1.0d0 + dcsevl (4.d0*z-1.d0, asincs,
     1  nterms))
      if (z.gt.0.5d0) dasin = pi2 - dsqrt(1.d0-z) * (1.d0 +
     1  dcsevl (3.0d0-4.0d0*z, asincs, nterms))
c
      if (x.ne.0.d0) dasin = dsign (dasin, x)
      return
c
 20   if (y.gt.1.0d0+sqeps) call seteru (
     1  33hdasin   abs(x) greater than 1+eta, 33, 2, 2)
      call seteru (33hdasin   abs(x) gt 1, but lt 1+eta, 33, 1, 1)
      dasin = dsign (pi2, x)
      return
c
      end