cbrt.f 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. *DECK CBRT
  2. FUNCTION CBRT (X)
  3. C***BEGIN PROLOGUE CBRT
  4. C***PURPOSE Compute the cube root.
  5. C***LIBRARY SLATEC (FNLIB)
  6. C***CATEGORY C2
  7. C***TYPE SINGLE 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 CBRT(X) calculates the cube root of X.
  13. C
  14. C***REFERENCES (NONE)
  15. C***ROUTINES CALLED R1MACH, R9PAK, R9UPAK
  16. C***REVISION HISTORY (YYMMDD)
  17. C 770601 DATE WRITTEN
  18. C 890531 Changed all specific intrinsics to generic. (WRB)
  19. C 890531 REVISION DATE from Version 3.2
  20. C 891214 Prologue converted to Version 4.0 format. (BAB)
  21. C***END PROLOGUE CBRT
  22. DIMENSION CBRT2(5)
  23. SAVE CBRT2, NITER
  24. DATA CBRT2(1) / 0.6299605249 4743658E0 /
  25. DATA CBRT2(2) / 0.7937005259 8409974E0 /
  26. DATA CBRT2(3) / 1.0E0 /
  27. DATA CBRT2(4) / 1.2599210498 9487316E0 /
  28. DATA CBRT2(5) / 1.5874010519 6819947E0 /
  29. DATA NITER / 0 /
  30. C***FIRST EXECUTABLE STATEMENT CBRT
  31. IF (NITER.EQ.0) NITER = 1.443*LOG(-.106*LOG(0.1*R1MACH(3))) + 1.
  32. C
  33. CBRT = 0.0
  34. IF (X.EQ.0.) RETURN
  35. C
  36. CALL R9UPAK (ABS(X), Y, N)
  37. IXPNT = N/3
  38. IREM = N - 3*IXPNT + 3
  39. C
  40. C THE APPROXIMATION BELOW IS A GENERALIZED CHEBYSHEV SERIES CONVERTED
  41. C TO POLYNOMIAL FORM. THE APPROX IS NEARLY BEST IN THE SENSE OF
  42. C RELATIVE ERROR WITH 4.085 DIGITS ACCURACY.
  43. C
  44. CBRT = .439581E0 + Y*(.928549E0 + Y*(-.512653E0 + Y*.144586E0))
  45. C
  46. DO 10 ITER=1,NITER
  47. CBRTSQ = CBRT*CBRT
  48. CBRT = CBRT + (Y-CBRT*CBRTSQ)/(3.0*CBRTSQ)
  49. 10 CONTINUE
  50. C
  51. CBRT = R9PAK (CBRT2(IREM)*SIGN(CBRT,X), IXPNT)
  52. RETURN
  53. C
  54. END