d9pak.f 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. *DECK D9PAK
  2. DOUBLE PRECISION FUNCTION D9PAK (Y, N)
  3. C***BEGIN PROLOGUE D9PAK
  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 DOUBLE 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 X. This routine is
  13. C almost the inverse of D9UPAK. It is not exactly the inverse, because
  14. C ABS(X) need not be between 0.5 and 1.0. If both D9PAK and 2.d0**N
  15. C were known to be in range we could compute
  16. C D9PAK = X *2.0d0**N
  17. C
  18. C***REFERENCES (NONE)
  19. C***ROUTINES CALLED D1MACH, D9UPAK, I1MACH, XERMSG
  20. C***REVISION HISTORY (YYMMDD)
  21. C 790801 DATE WRITTEN
  22. C 890531 Changed all specific intrinsics to generic. (WRB)
  23. C 890911 Removed unnecessary intrinsics. (WRB)
  24. C 891009 Corrected error when XERROR called. (WRB)
  25. C 891009 REVISION DATE from Version 3.2
  26. C 891214 Prologue converted to Version 4.0 format. (BAB)
  27. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  28. C 901009 Routine used I1MACH(7) where it should use I1MACH(10),
  29. C Corrected (RWC)
  30. C***END PROLOGUE D9PAK
  31. DOUBLE PRECISION Y, A1N2B,A1N210,D1MACH
  32. LOGICAL FIRST
  33. SAVE NMIN, NMAX, A1N210, FIRST
  34. DATA A1N210 / 3.321928094 8873623478 7031942948 9 D0 /
  35. DATA FIRST /.TRUE./
  36. C***FIRST EXECUTABLE STATEMENT D9PAK
  37. IF (FIRST) THEN
  38. A1N2B = 1.0D0
  39. IF(I1MACH(10).NE.2) A1N2B=D1MACH(5)*A1N210
  40. NMIN = A1N2B*I1MACH(15)
  41. NMAX = A1N2B*I1MACH(16)
  42. ENDIF
  43. FIRST = .FALSE.
  44. C
  45. CALL D9UPAK(Y,D9PAK,NY)
  46. C
  47. NSUM=N+NY
  48. IF(NSUM.LT.NMIN)GO TO 40
  49. IF (NSUM .GT. NMAX) CALL XERMSG ('SLATEC', 'D9PAK',
  50. + 'PACKED NUMBER OVERFLOWS', 1, 2)
  51. C
  52. IF (NSUM.EQ.0) RETURN
  53. IF(NSUM.GT.0) GO TO 30
  54. C
  55. 20 D9PAK = 0.5D0*D9PAK
  56. NSUM=NSUM+1
  57. IF(NSUM.NE.0) GO TO 20
  58. RETURN
  59. C
  60. 30 D9PAK = 2.0D0*D9PAK
  61. NSUM=NSUM - 1
  62. IF (NSUM.NE.0) GO TO 30
  63. RETURN
  64. C
  65. 40 CALL XERMSG ('SLATEC', 'D9PAK', 'PACKED NUMBER UNDERFLOWS', 1, 1)
  66. D9PAK = 0.0D0
  67. RETURN
  68. C
  69. END