xset.f 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. *DECK XSET
  2. SUBROUTINE XSET (IRAD, NRADPL, DZERO, NBITS, IERROR)
  3. C***BEGIN PROLOGUE XSET
  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 (XSET-S, DXSET-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
  14. C SUBROUTINE XSET MUST BE CALLED PRIOR TO CALLING ANY OTHER
  15. C EXTENDED-RANGE SUBROUTINE. IT CALCULATES AND STORES SEVERAL
  16. C MACHINE-DEPENDENT CONSTANTS IN COMMON BLOCKS. THE USER MUST
  17. C SUPPLY FOUR CONSTANTS THAT PERTAIN TO HIS PARTICULAR COMPUTER.
  18. C THE CONSTANTS ARE
  19. C
  20. C IRAD = THE INTERNAL BASE OF SINGLE-PRECISION
  21. C ARITHMETIC IN THE COMPUTER.
  22. C NRADPL = THE NUMBER OF RADIX PLACES CARRIED IN
  23. C THE SINGLE-PRECISION REPRESENTATION.
  24. C DZERO = THE SMALLEST OF 1/DMIN, DMAX, DMAXLN WHERE
  25. C DMIN = THE SMALLEST POSITIVE SINGLE-PRECISION
  26. C NUMBER OR AN UPPER BOUND TO THIS NUMBER,
  27. C DMAX = THE LARGEST SINGLE-PRECISION NUMBER
  28. C OR A LOWER BOUND TO THIS NUMBER,
  29. C DMAXLN = THE LARGEST SINGLE-PRECISION NUMBER
  30. C SUCH THAT LOG10(DMAXLN) CAN BE COMPUTED BY THE
  31. C FORTRAN SYSTEM (ON MOST SYSTEMS DMAXLN = DMAX).
  32. C NBITS = THE NUMBER OF BITS (EXCLUSIVE OF SIGN) IN
  33. C AN INTEGER COMPUTER WORD.
  34. C
  35. C ALTERNATIVELY, ANY OR ALL OF THE CONSTANTS CAN BE GIVEN
  36. C THE VALUE 0 (0.0 FOR DZERO). IF A CONSTANT IS ZERO, XSET TRIES
  37. C TO ASSIGN AN APPROPRIATE VALUE BY CALLING I1MACH
  38. C (SEE P.A.FOX, A.D.HALL, N.L.SCHRYER, ALGORITHM 528 FRAMEWORK
  39. C FOR A PORTABLE LIBRARY, ACM TRANSACTIONS ON MATH SOFTWARE,
  40. C V.4, NO.2, JUNE 1978, 177-188).
  41. C
  42. C THIS IS THE SETTING-UP SUBROUTINE FOR A PACKAGE OF SUBROUTINES
  43. C THAT FACILITATE THE USE OF EXTENDED-RANGE ARITHMETIC. EXTENDED-RANGE
  44. C ARITHMETIC ON A PARTICULAR COMPUTER IS DEFINED ON THE SET OF NUMBERS
  45. C OF THE FORM
  46. C
  47. C (X,IX) = X*RADIX**IX
  48. C
  49. C WHERE X IS A SINGLE-PRECISION NUMBER CALLED THE PRINCIPAL PART,
  50. C IX IS AN INTEGER CALLED THE AUXILIARY INDEX, AND RADIX IS THE
  51. C INTERNAL BASE OF THE SINGLE-PRECISION ARITHMETIC. OBVIOUSLY,
  52. C EACH REAL NUMBER IS REPRESENTABLE WITHOUT ERROR BY MORE THAN ONE
  53. C EXTENDED-RANGE FORM. CONVERSIONS BETWEEN DIFFERENT FORMS ARE
  54. C ESSENTIAL IN CARRYING OUT ARITHMETIC OPERATIONS. WITH THE CHOICE
  55. C OF RADIX WE HAVE MADE, AND THE SUBROUTINES WE HAVE WRITTEN, THESE
  56. C CONVERSIONS ARE PERFORMED WITHOUT ERROR (AT LEAST ON MOST COMPUTERS).
  57. C (SEE SMITH, J.M., OLVER, F.W.J., AND LOZIER, D.W., EXTENDED-RANGE
  58. C ARITHMETIC AND NORMALIZED LEGENDRE POLYNOMIALS, ACM TRANSACTIONS ON
  59. C MATHEMATICAL SOFTWARE, MARCH 1981).
  60. C
  61. C AN EXTENDED-RANGE NUMBER (X,IX) IS SAID TO BE IN ADJUSTED FORM IF
  62. C X AND IX ARE ZERO OR
  63. C
  64. C RADIX**(-L) .LE. ABS(X) .LT. RADIX**L
  65. C
  66. C IS SATISFIED, WHERE L IS A COMPUTER-DEPENDENT INTEGER DEFINED IN THIS
  67. C SUBROUTINE. TWO EXTENDED-RANGE NUMBERS IN ADJUSTED FORM CAN BE ADDED,
  68. C SUBTRACTED, MULTIPLIED OR DIVIDED (IF THE DIVISOR IS NONZERO) WITHOUT
  69. C CAUSING OVERFLOW OR UNDERFLOW IN THE PRINCIPAL PART OF THE RESULT.
  70. C WITH PROPER USE OF THE EXTENDED-RANGE SUBROUTINES, THE ONLY OVERFLOW
  71. C THAT CAN OCCUR IS INTEGER OVERFLOW IN THE AUXILIARY INDEX. IF THIS
  72. C IS DETECTED, THE SOFTWARE CALLS XERROR (A GENERAL ERROR-HANDLING
  73. C FORTRAN SUBROUTINE PACKAGE).
  74. C
  75. C MULTIPLICATION AND DIVISION IS PERFORMED BY SETTING
  76. C
  77. C (X,IX)*(Y,IY) = (X*Y,IX+IY)
  78. C OR
  79. C (X,IX)/(Y,IY) = (X/Y,IX-IY).
  80. C
  81. C PRE-ADJUSTMENT OF THE OPERANDS IS ESSENTIAL TO AVOID
  82. C OVERFLOW OR UNDERFLOW OF THE PRINCIPAL PART. SUBROUTINE
  83. C XADJ (SEE BELOW) MAY BE CALLED TO TRANSFORM ANY EXTENDED-
  84. C RANGE NUMBER INTO ADJUSTED FORM.
  85. C
  86. C ADDITION AND SUBTRACTION REQUIRE THE USE OF SUBROUTINE XADD
  87. C (SEE BELOW). THE INPUT OPERANDS NEED NOT BE IN ADJUSTED FORM.
  88. C HOWEVER, THE RESULT OF ADDITION OR SUBTRACTION IS RETURNED
  89. C IN ADJUSTED FORM. THUS, FOR EXAMPLE, IF (X,IX),(Y,IY),
  90. C (U,IU), AND (V,IV) ARE IN ADJUSTED FORM, THEN
  91. C
  92. C (X,IX)*(Y,IY) + (U,IU)*(V,IV)
  93. C
  94. C CAN BE COMPUTED AND STORED IN ADJUSTED FORM WITH NO EXPLICIT
  95. C CALLS TO XADJ.
  96. C
  97. C WHEN AN EXTENDED-RANGE NUMBER IS TO BE PRINTED, IT MUST BE
  98. C CONVERTED TO AN EXTENDED-RANGE FORM WITH DECIMAL RADIX. SUBROUTINE
  99. C XCON IS PROVIDED FOR THIS PURPOSE.
  100. C
  101. C THE SUBROUTINES CONTAINED IN THIS PACKAGE ARE
  102. C
  103. C SUBROUTINE XADD
  104. C USAGE
  105. C CALL XADD(X,IX,Y,IY,Z,IZ,IERROR)
  106. C IF (IERROR.NE.0) RETURN
  107. C DESCRIPTION
  108. C FORMS THE EXTENDED-RANGE SUM (Z,IZ) =
  109. C (X,IX) + (Y,IY). (Z,IZ) IS ADJUSTED
  110. C BEFORE RETURNING. THE INPUT OPERANDS
  111. C NEED NOT BE IN ADJUSTED FORM, BUT THEIR
  112. C PRINCIPAL PARTS MUST SATISFY
  113. C RADIX**(-2L).LE.ABS(X).LE.RADIX**(2L),
  114. C RADIX**(-2L).LE.ABS(Y).LE.RADIX**(2L).
  115. C
  116. C SUBROUTINE XADJ
  117. C USAGE
  118. C CALL XADJ(X,IX,IERROR)
  119. C IF (IERROR.NE.0) RETURN
  120. C DESCRIPTION
  121. C TRANSFORMS (X,IX) SO THAT
  122. C RADIX**(-L) .LE. ABS(X) .LT. RADIX**L.
  123. C ON MOST COMPUTERS THIS TRANSFORMATION DOES
  124. C NOT CHANGE THE MANTISSA OF X PROVIDED RADIX IS
  125. C THE NUMBER BASE OF SINGLE-PRECISION ARITHMETIC.
  126. C
  127. C SUBROUTINE XC210
  128. C USAGE
  129. C CALL XC210(K,Z,J,IERROR)
  130. C IF (IERROR.NE.0) RETURN
  131. C DESCRIPTION
  132. C GIVEN K THIS SUBROUTINE COMPUTES J AND Z
  133. C SUCH THAT RADIX**K = Z*10**J, WHERE Z IS IN
  134. C THE RANGE 1/10 .LE. Z .LT. 1.
  135. C THE VALUE OF Z WILL BE ACCURATE TO FULL
  136. C SINGLE-PRECISION PROVIDED THE NUMBER
  137. C OF DECIMAL PLACES IN THE LARGEST
  138. C INTEGER PLUS THE NUMBER OF DECIMAL
  139. C PLACES CARRIED IN SINGLE-PRECISION DOES NOT
  140. C EXCEED 60. XC210 IS CALLED BY SUBROUTINE
  141. C XCON WHEN NECESSARY. THE USER SHOULD
  142. C NEVER NEED TO CALL XC210 DIRECTLY.
  143. C
  144. C SUBROUTINE XCON
  145. C USAGE
  146. C CALL XCON(X,IX,IERROR)
  147. C IF (IERROR.NE.0) RETURN
  148. C DESCRIPTION
  149. C CONVERTS (X,IX) = X*RADIX**IX
  150. C TO DECIMAL FORM IN PREPARATION FOR
  151. C PRINTING, SO THAT (X,IX) = X*10**IX
  152. C WHERE 1/10 .LE. ABS(X) .LT. 1
  153. C IS RETURNED, EXCEPT THAT IF
  154. C (ABS(X),IX) IS BETWEEN RADIX**(-2L)
  155. C AND RADIX**(2L) THEN THE REDUCED
  156. C FORM WITH IX = 0 IS RETURNED.
  157. C
  158. C SUBROUTINE XRED
  159. C USAGE
  160. C CALL XRED(X,IX,IERROR)
  161. C IF (IERROR.NE.0) RETURN
  162. C DESCRIPTION
  163. C IF
  164. C RADIX**(-2L) .LE. (ABS(X),IX) .LE. RADIX**(2L)
  165. C THEN XRED TRANSFORMS (X,IX) SO THAT IX=0.
  166. C IF (X,IX) IS OUTSIDE THE ABOVE RANGE,
  167. C THEN XRED TAKES NO ACTION.
  168. C THIS SUBROUTINE IS USEFUL IF THE
  169. C RESULTS OF EXTENDED-RANGE CALCULATIONS
  170. C ARE TO BE USED IN SUBSEQUENT ORDINARY
  171. C SINGLE-PRECISION CALCULATIONS.
  172. C
  173. C***REFERENCES Smith, Olver and Lozier, Extended-Range Arithmetic and
  174. C Normalized Legendre Polynomials, ACM Trans on Math
  175. C Softw, v 7, n 1, March 1981, pp 93--105.
  176. C***ROUTINES CALLED I1MACH, XERMSG
  177. C***COMMON BLOCKS XBLK1, XBLK2, XBLK3
  178. C***REVISION HISTORY (YYMMDD)
  179. C 820712 DATE WRITTEN
  180. C 881020 Revised to meet SLATEC CML recommendations. (DWL and JMS)
  181. C 901019 Revisions to prologue. (DWL and WRB)
  182. C 901106 Changed all specific intrinsics to generic. (WRB)
  183. C Corrected order of sections in prologue and added TYPE
  184. C section. (WRB)
  185. C CALLs to XERROR changed to CALLs to XERMSG. (WRB)
  186. C 920127 Revised PURPOSE section of prologue. (DWL)
  187. C***END PROLOGUE XSET
  188. INTEGER IRAD, NRADPL, NBITS
  189. REAL DZERO, DZEROX
  190. COMMON /XBLK1/ NBITSF
  191. SAVE /XBLK1/
  192. REAL RADIX, RADIXL, RAD2L, DLG10R
  193. INTEGER L, L2, KMAX
  194. COMMON /XBLK2/ RADIX, RADIXL, RAD2L, DLG10R, L, L2, KMAX
  195. SAVE /XBLK2/
  196. INTEGER NLG102, MLG102, LG102
  197. COMMON /XBLK3/ NLG102, MLG102, LG102(21)
  198. SAVE /XBLK3/
  199. INTEGER IFLAG
  200. SAVE IFLAG
  201. C
  202. DIMENSION LOG102(20), LGTEMP(20)
  203. SAVE LOG102
  204. C
  205. C LOG102 CONTAINS THE FIRST 60 DIGITS OF LOG10(2) FOR USE IN
  206. C CONVERSION OF EXTENDED-RANGE NUMBERS TO BASE 10 .
  207. DATA LOG102 /301,029,995,663,981,195,213,738,894,724,493,026,768,
  208. * 189,881,462,108,541,310,428/
  209. C
  210. C FOLLOWING CODING PREVENTS XSET FROM BEING EXECUTED MORE THAN ONCE.
  211. C THIS IS IMPORTANT BECAUSE SOME SUBROUTINES (SUCH AS XNRMP AND
  212. C XLEGF) CALL XSET TO MAKE SURE EXTENDED-RANGE ARITHMETIC HAS
  213. C BEEN INITIALIZED. THE USER MAY WANT TO PRE-EMPT THIS CALL, FOR
  214. C EXAMPLE WHEN I1MACH IS NOT AVAILABLE. SEE CODING BELOW.
  215. DATA IFLAG /0/
  216. C***FIRST EXECUTABLE STATEMENT XSET
  217. IERROR=0
  218. IF (IFLAG .NE. 0) RETURN
  219. IRADX = IRAD
  220. NRDPLC = NRADPL
  221. DZEROX = DZERO
  222. IMINEX = 0
  223. IMAXEX = 0
  224. NBITSX = NBITS
  225. C FOLLOWING 5 STATEMENTS SHOULD BE DELETED IF I1MACH IS
  226. C NOT AVAILABLE OR NOT CONFIGURED TO RETURN THE CORRECT
  227. C MACHINE-DEPENDENT VALUES.
  228. IF (IRADX .EQ. 0) IRADX = I1MACH (10)
  229. IF (NRDPLC .EQ. 0) NRDPLC = I1MACH (11)
  230. IF (DZEROX .EQ. 0.0) IMINEX = I1MACH (12)
  231. IF (DZEROX .EQ. 0.0) IMAXEX = I1MACH (13)
  232. IF (NBITSX .EQ. 0) NBITSX = I1MACH (8)
  233. IF (IRADX.EQ.2) GO TO 10
  234. IF (IRADX.EQ.4) GO TO 10
  235. IF (IRADX.EQ.8) GO TO 10
  236. IF (IRADX.EQ.16) GO TO 10
  237. CALL XERMSG ('SLATEC', 'XSET', 'IMPROPER VALUE OF IRAD', 101, 1)
  238. IERROR=101
  239. RETURN
  240. 10 CONTINUE
  241. LOG2R=0
  242. IF (IRADX.EQ.2) LOG2R = 1
  243. IF (IRADX.EQ.4) LOG2R = 2
  244. IF (IRADX.EQ.8) LOG2R = 3
  245. IF (IRADX.EQ.16) LOG2R = 4
  246. NBITSF=LOG2R*NRDPLC
  247. RADIX = IRADX
  248. DLG10R = LOG10(RADIX)
  249. IF (DZEROX .NE. 0.0) GO TO 14
  250. LX = MIN ((1-IMINEX)/2, (IMAXEX-1)/2)
  251. GO TO 16
  252. 14 LX = 0.5*LOG10(DZEROX)/DLG10R
  253. C RADIX**(2*L) SHOULD NOT OVERFLOW, BUT REDUCE L BY 1 FOR FURTHER
  254. C PROTECTION.
  255. LX=LX-1
  256. 16 L2 = 2*LX
  257. IF (LX.GE.4) GO TO 20
  258. CALL XERMSG ('SLATEC', 'XSET', 'IMPROPER VALUE OF DZERO', 102, 1)
  259. IERROR=102
  260. RETURN
  261. 20 L = LX
  262. RADIXL = RADIX**L
  263. RAD2L = RADIXL**2
  264. C IT IS NECESSARY TO RESTRICT NBITS (OR NBITSX) TO BE LESS THAN SOME
  265. C UPPER LIMIT BECAUSE OF BINARY-TO-DECIMAL CONVERSION. SUCH CONVERSION
  266. C IS DONE BY XC210 AND REQUIRES A CONSTANT THAT IS STORED TO SOME FIXED
  267. C PRECISION. THE STORED CONSTANT (LOG102 IN THIS ROUTINE) PROVIDES
  268. C FOR CONVERSIONS ACCURATE TO THE LAST DECIMAL DIGIT WHEN THE INTEGER
  269. C WORD LENGTH DOES NOT EXCEED 63. A LOWER LIMIT OF 15 BITS IS IMPOSED
  270. C BECAUSE THE SOFTWARE IS DESIGNED TO RUN ON COMPUTERS WITH INTEGER WORD
  271. C LENGTH OF AT LEAST 16 BITS.
  272. IF (15.LE.NBITSX .AND. NBITSX.LE.63) GO TO 30
  273. CALL XERMSG ('SLATEC', 'XSET', 'IMPROPER VALUE OF NBITS', 103, 1)
  274. IERROR=103
  275. RETURN
  276. 30 CONTINUE
  277. KMAX = 2**(NBITSX-1) - L2
  278. NB = (NBITSX-1)/2
  279. MLG102 = 2**NB
  280. IF (1.LE.NRDPLC*LOG2R .AND. NRDPLC*LOG2R.LE.120) GO TO 40
  281. CALL XERMSG ('SLATEC', 'XSET', 'IMPROPER VALUE OF NRADPL', 104, 1)
  282. IERROR=104
  283. RETURN
  284. 40 CONTINUE
  285. NLG102 = NRDPLC*LOG2R/NB + 3
  286. NP1 = NLG102 + 1
  287. C
  288. C AFTER COMPLETION OF THE FOLLOWING LOOP, IC CONTAINS
  289. C THE INTEGER PART AND LGTEMP CONTAINS THE FRACTIONAL PART
  290. C OF LOG10(IRADX) IN RADIX 1000.
  291. IC = 0
  292. DO 50 II=1,20
  293. I = 21 - II
  294. IT = LOG2R*LOG102(I) + IC
  295. IC = IT/1000
  296. LGTEMP(I) = MOD(IT,1000)
  297. 50 CONTINUE
  298. C
  299. C AFTER COMPLETION OF THE FOLLOWING LOOP, LG102 CONTAINS
  300. C LOG10(IRADX) IN RADIX MLG102. THE RADIX POINT IS
  301. C BETWEEN LG102(1) AND LG102(2).
  302. LG102(1) = IC
  303. DO 80 I=2,NP1
  304. LG102X = 0
  305. DO 70 J=1,NB
  306. IC = 0
  307. DO 60 KK=1,20
  308. K = 21 - KK
  309. IT = 2*LGTEMP(K) + IC
  310. IC = IT/1000
  311. LGTEMP(K) = MOD(IT,1000)
  312. 60 CONTINUE
  313. LG102X = 2*LG102X + IC
  314. 70 CONTINUE
  315. LG102(I) = LG102X
  316. 80 CONTINUE
  317. C
  318. C CHECK SPECIAL CONDITIONS REQUIRED BY SUBROUTINES...
  319. IF (NRDPLC.LT.L) GO TO 90
  320. CALL XERMSG ('SLATEC', 'XSET', 'NRADPL .GE. L', 105, 1)
  321. IERROR=105
  322. RETURN
  323. 90 IF (6*L.LE.KMAX) GO TO 100
  324. CALL XERMSG ('SLATEC', 'XSET', '6*L .GT. KMAX', 106, 1)
  325. IERROR=106
  326. RETURN
  327. 100 CONTINUE
  328. IFLAG = 1
  329. RETURN
  330. END