dxset.f 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. *DECK DXSET
  2. SUBROUTINE DXSET (IRAD, NRADPL, DZERO, NBITS, IERROR)
  3. C***BEGIN PROLOGUE DXSET
  4. C***PURPOSE To provide double-precision floating-point arithmetic
  5. C with an extended exponent range.
  6. C***LIBRARY SLATEC
  7. C***CATEGORY A3D
  8. C***TYPE DOUBLE PRECISION (XSET-S, DXSET-D)
  9. C***KEYWORDS EXTENDED-RANGE DOUBLE-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 DXSET 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 DOUBLE-PRECISION
  21. C ARITHMETIC IN THE COMPUTER.
  22. C NRADPL = THE NUMBER OF RADIX PLACES CARRIED IN
  23. C THE DOUBLE-PRECISION REPRESENTATION.
  24. C DZERO = THE SMALLEST OF 1/DMIN, DMAX, DMAXLN WHERE
  25. C DMIN = THE SMALLEST POSITIVE DOUBLE-PRECISION
  26. C NUMBER OR AN UPPER BOUND TO THIS NUMBER,
  27. C DMAX = THE LARGEST DOUBLE-PRECISION NUMBER
  28. C OR A LOWER BOUND TO THIS NUMBER,
  29. C DMAXLN = THE LARGEST DOUBLE-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.0D0 FOR DZERO). IF A CONSTANT IS ZERO, DXSET 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 DOUBLE-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 DOUBLE-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 DXADJ (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 DXADD
  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 DXADJ.
  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 DXCON IS PROVIDED FOR THIS PURPOSE.
  100. C
  101. C THE SUBROUTINES CONTAINED IN THIS PACKAGE ARE
  102. C
  103. C SUBROUTINE DXADD
  104. C USAGE
  105. C CALL DXADD(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 DXADJ
  117. C USAGE
  118. C CALL DXADJ(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 DOUBLE-PRECISION ARITHMETIC.
  126. C
  127. C SUBROUTINE DXC210
  128. C USAGE
  129. C CALL DXC210(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 DOUBLE-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 DOUBLE-PRECISION DOES NOT
  140. C EXCEED 60. DXC210 IS CALLED BY SUBROUTINE
  141. C DXCON WHEN NECESSARY. THE USER SHOULD
  142. C NEVER NEED TO CALL DXC210 DIRECTLY.
  143. C
  144. C SUBROUTINE DXCON
  145. C USAGE
  146. C CALL DXCON(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 DXRED
  159. C USAGE
  160. C CALL DXRED(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 DXRED TRANSFORMS (X,IX) SO THAT IX=0.
  166. C IF (X,IX) IS OUTSIDE THE ABOVE RANGE,
  167. C THEN DXRED 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 DOUBLE-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 DXBLK1, DXBLK2, DXBLK3
  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 DXSET
  188. INTEGER IRAD, NRADPL, NBITS
  189. DOUBLE PRECISION DZERO, DZEROX
  190. COMMON /DXBLK1/ NBITSF
  191. SAVE /DXBLK1/
  192. DOUBLE PRECISION RADIX, RADIXL, RAD2L, DLG10R
  193. INTEGER L, L2, KMAX
  194. COMMON /DXBLK2/ RADIX, RADIXL, RAD2L, DLG10R, L, L2, KMAX
  195. SAVE /DXBLK2/
  196. INTEGER NLG102, MLG102, LG102
  197. COMMON /DXBLK3/ NLG102, MLG102, LG102(21)
  198. SAVE /DXBLK3/
  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 DXSET FROM BEING EXECUTED MORE THAN ONCE.
  211. C THIS IS IMPORTANT BECAUSE SOME SUBROUTINES (SUCH AS DXNRMP AND
  212. C DXLEGF) CALL DXSET 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 DXSET
  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 (14)
  230. IF (DZEROX .EQ. 0.0D0) IMINEX = I1MACH (15)
  231. IF (DZEROX .EQ. 0.0D0) IMAXEX = I1MACH (16)
  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', 'DXSET', 'IMPROPER VALUE OF IRAD', 201, 1)
  238. IERROR=201
  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.0D0) GO TO 14
  250. LX = MIN ((1-IMINEX)/2, (IMAXEX-1)/2)
  251. GO TO 16
  252. 14 LX = 0.5D0*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', 'DXSET', 'IMPROPER VALUE OF DZERO', 202, 1)
  259. IERROR=202
  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 DXC210 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', 'DXSET', 'IMPROPER VALUE OF NBITS', 203, 1)
  274. IERROR=203
  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', 'DXSET', 'IMPROPER VALUE OF NRADPL', 204,
  282. + 1)
  283. IERROR=204
  284. RETURN
  285. 40 CONTINUE
  286. NLG102 = NRDPLC*LOG2R/NB + 3
  287. NP1 = NLG102 + 1
  288. C
  289. C AFTER COMPLETION OF THE FOLLOWING LOOP, IC CONTAINS
  290. C THE INTEGER PART AND LGTEMP CONTAINS THE FRACTIONAL PART
  291. C OF LOG10(IRADX) IN RADIX 1000.
  292. IC = 0
  293. DO 50 II=1,20
  294. I = 21 - II
  295. IT = LOG2R*LOG102(I) + IC
  296. IC = IT/1000
  297. LGTEMP(I) = MOD(IT,1000)
  298. 50 CONTINUE
  299. C
  300. C AFTER COMPLETION OF THE FOLLOWING LOOP, LG102 CONTAINS
  301. C LOG10(IRADX) IN RADIX MLG102. THE RADIX POINT IS
  302. C BETWEEN LG102(1) AND LG102(2).
  303. LG102(1) = IC
  304. DO 80 I=2,NP1
  305. LG102X = 0
  306. DO 70 J=1,NB
  307. IC = 0
  308. DO 60 KK=1,20
  309. K = 21 - KK
  310. IT = 2*LGTEMP(K) + IC
  311. IC = IT/1000
  312. LGTEMP(K) = MOD(IT,1000)
  313. 60 CONTINUE
  314. LG102X = 2*LG102X + IC
  315. 70 CONTINUE
  316. LG102(I) = LG102X
  317. 80 CONTINUE
  318. C
  319. C CHECK SPECIAL CONDITIONS REQUIRED BY SUBROUTINES...
  320. IF (NRDPLC.LT.L) GO TO 90
  321. CALL XERMSG ('SLATEC', 'DXSET', 'NRADPL .GE. L', 205, 1)
  322. IERROR=205
  323. RETURN
  324. 90 IF (6*L.LE.KMAX) GO TO 100
  325. CALL XERMSG ('SLATEC', 'DXSET', '6*L .GT. KMAX', 206, 1)
  326. IERROR=206
  327. RETURN
  328. 100 CONTINUE
  329. IFLAG = 1
  330. RETURN
  331. END