xadj.f 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. *DECK XADJ
  2. SUBROUTINE XADJ (X, IX, IERROR)
  3. C***BEGIN PROLOGUE XADJ
  4. C***PURPOSE To provide single-precision floating-point arithmetic
  5. C with an extended exponent range.
  6. C***LIBRARY SLATEC
  7. C***CATEGORY A3D
  8. C***TYPE SINGLE PRECISION (XADJ-S, DXADJ-D)
  9. C***KEYWORDS EXTENDED-RANGE SINGLE-PRECISION ARITHMETIC
  10. C***AUTHOR Lozier, Daniel W., (National Bureau of Standards)
  11. C Smith, John M., (NBS and George Mason University)
  12. C***DESCRIPTION
  13. C REAL X
  14. C INTEGER IX
  15. C
  16. C TRANSFORMS (X,IX) SO THAT
  17. C RADIX**(-L) .LE. ABS(X) .LT. RADIX**L.
  18. C ON MOST COMPUTERS THIS TRANSFORMATION DOES
  19. C NOT CHANGE THE MANTISSA OF X PROVIDED RADIX IS
  20. C THE NUMBER BASE OF SINGLE-PRECISION ARITHMETIC.
  21. C
  22. C***SEE ALSO XSET
  23. C***REFERENCES (NONE)
  24. C***ROUTINES CALLED XERMSG
  25. C***COMMON BLOCKS XBLK2
  26. C***REVISION HISTORY (YYMMDD)
  27. C 820712 DATE WRITTEN
  28. C 881020 Revised to meet SLATEC CML recommendations. (DWL and JMS)
  29. C 901019 Revisions to prologue. (DWL and WRB)
  30. C 901106 Changed all specific intrinsics to generic. (WRB)
  31. C Corrected order of sections in prologue and added TYPE
  32. C section. (WRB)
  33. C CALLs to XERROR changed to CALLs to XERMSG. (WRB)
  34. C 920127 Revised PURPOSE section of prologue. (DWL)
  35. C***END PROLOGUE XADJ
  36. REAL X
  37. INTEGER IX
  38. REAL RADIX, RADIXL, RAD2L, DLG10R
  39. INTEGER L, L2, KMAX
  40. COMMON /XBLK2/ RADIX, RADIXL, RAD2L, DLG10R, L, L2, KMAX
  41. SAVE /XBLK2/
  42. C
  43. C THE CONDITION IMPOSED ON L AND KMAX BY THIS SUBROUTINE
  44. C IS
  45. C 2*L .LE. KMAX
  46. C
  47. C THIS CONDITION MUST BE MET BY APPROPRIATE CODING
  48. C IN SUBROUTINE XSET.
  49. C
  50. C***FIRST EXECUTABLE STATEMENT XADJ
  51. IERROR=0
  52. IF (X.EQ.0.0) GO TO 50
  53. IF (ABS(X).GE.1.0) GO TO 20
  54. IF (RADIXL*ABS(X).GE.1.0) GO TO 60
  55. X = X*RAD2L
  56. IF (IX.LT.0) GO TO 10
  57. IX = IX - L2
  58. GO TO 70
  59. 10 IF (IX.LT.-KMAX+L2) GO TO 40
  60. IX = IX - L2
  61. GO TO 70
  62. 20 IF (ABS(X).LT.RADIXL) GO TO 60
  63. X = X/RAD2L
  64. IF (IX.GT.0) GO TO 30
  65. IX = IX + L2
  66. GO TO 70
  67. 30 IF (IX.GT.KMAX-L2) GO TO 40
  68. IX = IX + L2
  69. GO TO 70
  70. 40 CALL XERMSG ('SLATEC', 'XADJ', 'overflow in auxiliary index', 107,
  71. + 1)
  72. IERROR=107
  73. RETURN
  74. 50 IX = 0
  75. 60 IF (ABS(IX).GT.KMAX) GO TO 40
  76. 70 RETURN
  77. END