xcon.f 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. *DECK XCON
  2. SUBROUTINE XCON (X, IX, IERROR)
  3. C***BEGIN PROLOGUE XCON
  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 (XCON-S, DXCON-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 CONVERTS (X,IX) = X*RADIX**IX
  17. C TO DECIMAL FORM IN PREPARATION FOR
  18. C PRINTING, SO THAT (X,IX) = X*10**IX
  19. C WHERE 1/10 .LE. ABS(X) .LT. 1
  20. C IS RETURNED, EXCEPT THAT IF
  21. C (ABS(X),IX) IS BETWEEN RADIX**(-2L)
  22. C AND RADIX**(2L) THEN THE REDUCED
  23. C FORM WITH IX = 0 IS RETURNED.
  24. C
  25. C***SEE ALSO XSET
  26. C***REFERENCES (NONE)
  27. C***ROUTINES CALLED XADJ, XC210, XRED
  28. C***COMMON BLOCKS XBLK2
  29. C***REVISION HISTORY (YYMMDD)
  30. C 820712 DATE WRITTEN
  31. C 881020 Revised to meet SLATEC CML recommendations. (DWL and JMS)
  32. C 901019 Revisions to prologue. (DWL and WRB)
  33. C 901106 Changed all specific intrinsics to generic. (WRB)
  34. C Corrected order of sections in prologue and added TYPE
  35. C section. (WRB)
  36. C 920127 Revised PURPOSE section of prologue. (DWL)
  37. C***END PROLOGUE XCON
  38. REAL X
  39. INTEGER IX
  40. C
  41. C THE CONDITIONS IMPOSED ON L AND KMAX BY THIS SUBROUTINE
  42. C ARE
  43. C (1) 4 .LE. L .LE. 2**NBITS - 1 - KMAX
  44. C
  45. C (2) KMAX .LE. ((2**NBITS)-2)/LOG10R - L
  46. C
  47. C THESE CONDITIONS MUST BE MET BY APPROPRIATE CODING
  48. C IN SUBROUTINE XSET.
  49. C
  50. REAL RADIX, RADIXL, RAD2L, DLG10R
  51. INTEGER L, L2, KMAX
  52. COMMON /XBLK2/ RADIX, RADIXL, RAD2L, DLG10R, L, L2, KMAX
  53. SAVE /XBLK2/, ISPACE
  54. C
  55. REAL A, B, Z
  56. C
  57. DATA ISPACE /1/
  58. C THE PARAMETER ISPACE IS THE INCREMENT USED IN FORM-
  59. C ING THE AUXILIARY INDEX OF THE DECIMAL EXTENDED-RANGE
  60. C FORM. THE RETURNED VALUE OF IX WILL BE AN INTEGER MULT-
  61. C IPLE OF ISPACE. ISPACE MUST SATISFY 1 .LE. ISPACE .LE.
  62. C L/2. IF A VALUE GREATER THAN 1 IS TAKEN, THE RETURNED
  63. C VALUE OF X WILL SATISFY 10**(-ISPACE) .LE. ABS(X) .LE. 1
  64. C WHEN (ABS(X),IX) .LT. RADIX**(-2L) AND 1/10 .LE. ABS(X)
  65. C .LT. 10**(ISPACE-1) WHEN (ABS(X),IX) .GT. RADIX**(2L).
  66. C
  67. C***FIRST EXECUTABLE STATEMENT XCON
  68. IERROR=0
  69. CALL XRED(X, IX,IERROR)
  70. IF (IERROR.NE.0) RETURN
  71. IF (IX.EQ.0) GO TO 150
  72. CALL XADJ(X, IX,IERROR)
  73. IF (IERROR.NE.0) RETURN
  74. C
  75. C CASE 1 IS WHEN (X,IX) IS LESS THAN RADIX**(-2L) IN MAGNITUDE,
  76. C CASE 2 IS WHEN (X,IX) IS GREATER THAN RADIX**(2L) IN MAGNITUDE.
  77. ITEMP = 1
  78. ICASE = (3+SIGN(ITEMP,IX))/2
  79. GO TO (10, 20), ICASE
  80. 10 IF (ABS(X).LT.1.0) GO TO 30
  81. X = X/RADIXL
  82. IX = IX + L
  83. GO TO 30
  84. 20 IF (ABS(X).GE.1.0) GO TO 30
  85. X = X*RADIXL
  86. IX = IX - L
  87. 30 CONTINUE
  88. C
  89. C AT THIS POINT, RADIX**(-L) .LE. ABS(X) .LT. 1.0 IN CASE 1,
  90. C 1.0 .LE. ABS(X) .LT. RADIX**L IN CASE 2.
  91. I = LOG10(ABS(X))/DLG10R
  92. A = RADIX**I
  93. GO TO (40, 60), ICASE
  94. 40 IF (A.LE.RADIX*ABS(X)) GO TO 50
  95. I = I - 1
  96. A = A/RADIX
  97. GO TO 40
  98. 50 IF (ABS(X).LT.A) GO TO 80
  99. I = I + 1
  100. A = A*RADIX
  101. GO TO 50
  102. 60 IF (A.LE.ABS(X)) GO TO 70
  103. I = I - 1
  104. A = A/RADIX
  105. GO TO 60
  106. 70 IF (ABS(X).LT.RADIX*A) GO TO 80
  107. I = I + 1
  108. A = A*RADIX
  109. GO TO 70
  110. 80 CONTINUE
  111. C
  112. C AT THIS POINT I IS SUCH THAT
  113. C RADIX**(I-1) .LE. ABS(X) .LT. RADIX**I IN CASE 1,
  114. C RADIX**I .LE. ABS(X) .LT. RADIX**(I+1) IN CASE 2.
  115. ITEMP = ISPACE/DLG10R
  116. A = RADIX**ITEMP
  117. B = 10.0**ISPACE
  118. 90 IF (A.LE.B) GO TO 100
  119. ITEMP = ITEMP - 1
  120. A = A/RADIX
  121. GO TO 90
  122. 100 IF (B.LT.A*RADIX) GO TO 110
  123. ITEMP = ITEMP + 1
  124. A = A*RADIX
  125. GO TO 100
  126. 110 CONTINUE
  127. C
  128. C AT THIS POINT ITEMP IS SUCH THAT
  129. C RADIX**ITEMP .LE. 10**ISPACE .LT. RADIX**(ITEMP+1).
  130. IF (ITEMP.GT.0) GO TO 120
  131. C ITEMP = 0 IF, AND ONLY IF, ISPACE = 1 AND RADIX = 16.0
  132. X = X*RADIX**(-I)
  133. IX = IX + I
  134. CALL XC210(IX, Z, J,IERROR)
  135. IF (IERROR.NE.0) RETURN
  136. X = X*Z
  137. IX = J
  138. GO TO (130, 140), ICASE
  139. 120 CONTINUE
  140. I1 = I/ITEMP
  141. X = X*RADIX**(-I1*ITEMP)
  142. IX = IX + I1*ITEMP
  143. C
  144. C AT THIS POINT,
  145. C RADIX**(-ITEMP) .LE. ABS(X) .LT. 1.0 IN CASE 1,
  146. C 1.0 .LE. ABS(X) .LT. RADIX**ITEMP IN CASE 2.
  147. CALL XC210(IX, Z, J,IERROR)
  148. IF (IERROR.NE.0) RETURN
  149. J1 = J/ISPACE
  150. J2 = J - J1*ISPACE
  151. X = X*Z*10.0**J2
  152. IX = J1*ISPACE
  153. C
  154. C AT THIS POINT,
  155. C 10.0**(-2*ISPACE) .LE. ABS(X) .LT. 1.0 IN CASE 1,
  156. C 10.0**-1 .LE. ABS(X) .LT. 10.0**(2*ISPACE-1) IN CASE 2.
  157. GO TO (130, 140), ICASE
  158. 130 IF (B*ABS(X).GE.1.0) GO TO 150
  159. X = X*B
  160. IX = IX - ISPACE
  161. GO TO 130
  162. 140 IF (10.0*ABS(X).LT.B) GO TO 150
  163. X = X/B
  164. IX = IX + ISPACE
  165. GO TO 140
  166. 150 RETURN
  167. END