r9pak.f 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. *DECK R9PAK
  2. FUNCTION R9PAK (Y, N)
  3. C***BEGIN PROLOGUE R9PAK
  4. C***PURPOSE Pack a base 2 exponent into a floating point number.
  5. C***LIBRARY SLATEC (FNLIB)
  6. C***CATEGORY A6B
  7. C***TYPE SINGLE PRECISION (R9PAK-S, D9PAK-D)
  8. C***KEYWORDS FNLIB, PACK
  9. C***AUTHOR Fullerton, W., (LANL)
  10. C***DESCRIPTION
  11. C
  12. C Pack a base 2 exponent into floating point number Y. This
  13. C routine is almost the inverse of R9UPAK. It is not exactly
  14. C the inverse, because ABS(X) need not be between 0.5 and
  15. C 1.0. If both R9PAK and 2.0**N were known to be in range, we
  16. C could compute
  17. C R9PAK = Y * 2.0**N .
  18. C
  19. C***REFERENCES (NONE)
  20. C***ROUTINES CALLED I1MACH, R1MACH, R9UPAK, XERMSG
  21. C***REVISION HISTORY (YYMMDD)
  22. C 790801 DATE WRITTEN
  23. C 890531 Changed all specific intrinsics to generic. (WRB)
  24. C 890531 REVISION DATE from Version 3.2
  25. C 891214 Prologue converted to Version 4.0 format. (BAB)
  26. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  27. C 901009 Routine used I1MACH(7) where it should use I1MACH(10),
  28. C Corrected (RWC)
  29. C***END PROLOGUE R9PAK
  30. LOGICAL FIRST
  31. SAVE NMIN, NMAX, A1N210, FIRST
  32. DATA A1N210 / 3.321928094 887362 E0/
  33. DATA FIRST /.TRUE./
  34. C***FIRST EXECUTABLE STATEMENT R9PAK
  35. IF (FIRST) THEN
  36. A1N2B = 1.0
  37. IF (I1MACH(10).NE.2) A1N2B = R1MACH(5)*A1N210
  38. NMIN = A1N2B*I1MACH(12)
  39. NMAX = A1N2B*I1MACH(13)
  40. ENDIF
  41. FIRST = .FALSE.
  42. C
  43. CALL R9UPAK(Y,R9PAK,NY)
  44. C
  45. NSUM = N + NY
  46. IF (NSUM.LT.NMIN) GO TO 40
  47. IF (NSUM .GT. NMAX) CALL XERMSG ('SLATEC', 'R9PAK',
  48. + 'PACKED NUMBER OVERFLOWS', 2, 2)
  49. C
  50. IF (NSUM.EQ.0) RETURN
  51. IF (NSUM.GT.0) GO TO 30
  52. C
  53. 20 R9PAK = 0.5*R9PAK
  54. NSUM = NSUM + 1
  55. IF(NSUM.NE.0) GO TO 20
  56. RETURN
  57. C
  58. 30 R9PAK = 2.0*R9PAK
  59. NSUM = NSUM - 1
  60. IF(NSUM.NE.0) GO TO 30
  61. RETURN
  62. C
  63. 40 CALL XERMSG ('SLATEC', 'R9PAK', 'PACKED NUMBER UNDERFLOWS', 1, 1)
  64. R9PAK = 0.0
  65. RETURN
  66. C
  67. END