dcbrt.f 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. *DECK DCBRT
  2. DOUBLE PRECISION FUNCTION DCBRT (X)
  3. C***BEGIN PROLOGUE DCBRT
  4. C***PURPOSE Compute the cube root.
  5. C***LIBRARY SLATEC (FNLIB)
  6. C***CATEGORY C2
  7. C***TYPE DOUBLE PRECISION (CBRT-S, DCBRT-D, CCBRT-C)
  8. C***KEYWORDS CUBE ROOT, ELEMENTARY FUNCTIONS, FNLIB, ROOTS
  9. C***AUTHOR Fullerton, W., (LANL)
  10. C***DESCRIPTION
  11. C
  12. C DCBRT(X) calculates the double precision cube root for
  13. C double precision argument X.
  14. C
  15. C***REFERENCES (NONE)
  16. C***ROUTINES CALLED D1MACH, D9PAK, D9UPAK
  17. C***REVISION HISTORY (YYMMDD)
  18. C 770601 DATE WRITTEN
  19. C 890531 Changed all specific intrinsics to generic. (WRB)
  20. C 890531 REVISION DATE from Version 3.2
  21. C 891214 Prologue converted to Version 4.0 format. (BAB)
  22. C***END PROLOGUE DCBRT
  23. DOUBLE PRECISION X, CBRT2(5), Y, CBRTSQ, D9PAK, D1MACH
  24. SAVE CBRT2, NITER
  25. DATA CBRT2(1) / 0.6299605249 4743658238 3605303639 11 D0 /
  26. DATA CBRT2(2) / 0.7937005259 8409973737 5852819636 15 D0 /
  27. DATA CBRT2(3) / 1.0 D0 /
  28. DATA CBRT2(4) / 1.2599210498 9487316476 7210607278 23 D0 /
  29. DATA CBRT2(5) / 1.5874010519 6819947475 1705639272 31 D0 /
  30. DATA NITER / 0 /
  31. C***FIRST EXECUTABLE STATEMENT DCBRT
  32. IF (NITER.EQ.0) NITER = 1.443*LOG(-.106*LOG(0.1*REAL(D1MACH(3)))
  33. 1 ) + 1.0
  34. C
  35. DCBRT = 0.D0
  36. IF (X.EQ.0.D0) RETURN
  37. C
  38. CALL D9UPAK (ABS(X), Y, N)
  39. IXPNT = N/3
  40. IREM = N - 3*IXPNT + 3
  41. C
  42. C THE APPROXIMATION BELOW IS A GENERALIZED CHEBYSHEV SERIES CONVERTED
  43. C TO POLYNOMIAL FORM. THE APPROX IS NEARLY BEST IN THE SENSE OF
  44. C RELATIVE ERROR WITH 4.085 DIGITS ACCURACY.
  45. C
  46. Z = Y
  47. DCBRT = .439581E0 + Z*(.928549E0 + Z*(-.512653E0 + Z*.144586E0))
  48. C
  49. DO 10 ITER=1,NITER
  50. CBRTSQ = DCBRT*DCBRT
  51. DCBRT = DCBRT + (Y-DCBRT*CBRTSQ)/(3.D0*CBRTSQ)
  52. 10 CONTINUE
  53. C
  54. DCBRT = D9PAK (CBRT2(IREM)*SIGN(DCBRT,X), IXPNT)
  55. RETURN
  56. C
  57. END