double precision function dsqrt (x) c june 1977 edition. w. fullerton, c3, los alamos scientific lab. double precision x, sqrt2(3), y, d9pak, d1mach external alog, d1mach, d9pak data sqrt2(1) / 0.7071067811 8654752440 0844362104 85 d0 / data sqrt2(2) / 1.0 d0 / data sqrt2(3) / 1.4142135623 7309504880 1688724209 70 d0 / c data niter / 0 / c if (niter.eq.0) niter = 1.443*alog(-0.104*alog(0.1*sngl(d1mach(3)) 1 )) + 1.0 c if (x.le.0.d0) go to 20 c call d9upak (x, y, n) ixpnt = n/2 irem = n - 2*ixpnt + 2 c c the approximation below has accuracy of 4.16 digits. z = y dsqrt = .261599e0 + z*(1.114292e0 + z*(-.516888e0 + z*.141067e0)) c do 10 iter=1,niter dsqrt = dsqrt + 0.5d0*(y - dsqrt*dsqrt) / dsqrt 10 continue c dsqrt = d9pak (sqrt2(irem)*dsqrt, ixpnt) return c 20 if (x.lt.0.d0) call seteru (21hdsqrt x is negative, 21, 1, 1) dsqrt = 0.0d0 return c end