dxc210.f 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. *DECK DXC210
  2. SUBROUTINE DXC210 (K, Z, J, IERROR)
  3. C***BEGIN PROLOGUE DXC210
  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 (XC210-S, DXC210-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 INTEGER K, J
  14. C DOUBLE PRECISION Z
  15. C
  16. C GIVEN K THIS SUBROUTINE COMPUTES J AND Z
  17. C SUCH THAT RADIX**K = Z*10**J, WHERE Z IS IN
  18. C THE RANGE 1/10 .LE. Z .LT. 1.
  19. C THE VALUE OF Z WILL BE ACCURATE TO FULL
  20. C DOUBLE-PRECISION PROVIDED THE NUMBER
  21. C OF DECIMAL PLACES IN THE LARGEST
  22. C INTEGER PLUS THE NUMBER OF DECIMAL
  23. C PLACES CARRIED IN DOUBLE-PRECISION DOES NOT
  24. C EXCEED 60. DXC210 IS CALLED BY SUBROUTINE
  25. C DXCON WHEN NECESSARY. THE USER SHOULD
  26. C NEVER NEED TO CALL DXC210 DIRECTLY.
  27. C
  28. C***SEE ALSO DXSET
  29. C***REFERENCES (NONE)
  30. C***ROUTINES CALLED XERMSG
  31. C***COMMON BLOCKS DXBLK3
  32. C***REVISION HISTORY (YYMMDD)
  33. C 820712 DATE WRITTEN
  34. C 890126 Revised to meet SLATEC CML recommendations. (DWL and JMS)
  35. C 901019 Revisions to prologue. (DWL and WRB)
  36. C 901106 Changed all specific intrinsics to generic. (WRB)
  37. C Corrected order of sections in prologue and added TYPE
  38. C section. (WRB)
  39. C CALLs to XERROR changed to CALLs to XERMSG. (WRB)
  40. C 920127 Revised PURPOSE section of prologue. (DWL)
  41. C***END PROLOGUE DXC210
  42. DOUBLE PRECISION Z
  43. INTEGER K, J
  44. INTEGER NLG102, MLG102, LG102
  45. COMMON /DXBLK3/ NLG102, MLG102, LG102(21)
  46. SAVE /DXBLK3/
  47. C
  48. C THE CONDITIONS IMPOSED ON NLG102, MLG102, AND LG102 BY
  49. C THIS SUBROUTINE ARE
  50. C
  51. C (1) NLG102 .GE. 2
  52. C
  53. C (2) MLG102 .GE. 1
  54. C
  55. C (3) 2*MLG102*(MLG102 - 1) .LE. 2**NBITS - 1
  56. C
  57. C THESE CONDITIONS MUST BE MET BY APPROPRIATE CODING
  58. C IN SUBROUTINE DXSET.
  59. C
  60. C***FIRST EXECUTABLE STATEMENT DXC210
  61. IERROR=0
  62. IF (K.EQ.0) GO TO 70
  63. M = MLG102
  64. KA = ABS(K)
  65. KA1 = KA/M
  66. KA2 = MOD(KA,M)
  67. IF (KA1.GE.M) GO TO 60
  68. NM1 = NLG102 - 1
  69. NP1 = NLG102 + 1
  70. IT = KA2*LG102(NP1)
  71. IC = IT/M
  72. ID = MOD(IT,M)
  73. Z = ID
  74. IF (KA1.GT.0) GO TO 20
  75. DO 10 II=1,NM1
  76. I = NP1 - II
  77. IT = KA2*LG102(I) + IC
  78. IC = IT/M
  79. ID = MOD(IT,M)
  80. Z = Z/M + ID
  81. 10 CONTINUE
  82. JA = KA*LG102(1) + IC
  83. GO TO 40
  84. 20 CONTINUE
  85. DO 30 II=1,NM1
  86. I = NP1 - II
  87. IT = KA2*LG102(I) + KA1*LG102(I+1) + IC
  88. IC = IT/M
  89. ID = MOD(IT,M)
  90. Z = Z/M + ID
  91. 30 CONTINUE
  92. JA = KA*LG102(1) + KA1*LG102(2) + IC
  93. 40 CONTINUE
  94. Z = Z/M
  95. IF (K.GT.0) GO TO 50
  96. J = -JA
  97. Z = 10.0D0**(-Z)
  98. GO TO 80
  99. 50 CONTINUE
  100. J = JA + 1
  101. Z = 10.0D0**(Z-1.0D0)
  102. GO TO 80
  103. 60 CONTINUE
  104. C THIS ERROR OCCURS IF K EXCEEDS MLG102**2 - 1 IN MAGNITUDE.
  105. C
  106. CALL XERMSG ('SLATEC', 'DXC210', 'K too large', 208, 1)
  107. IERROR=208
  108. RETURN
  109. 70 CONTINUE
  110. J = 0
  111. Z = 1.0D0
  112. 80 RETURN
  113. END