dxred.f 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. *DECK DXRED
  2. SUBROUTINE DXRED (X, IX, IERROR)
  3. C***BEGIN PROLOGUE DXRED
  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 (XRED-S, DXRED-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 DOUBLE PRECISION X
  14. C INTEGER IX
  15. C
  16. C IF
  17. C RADIX**(-2L) .LE. (ABS(X),IX) .LE. RADIX**(2L)
  18. C THEN DXRED TRANSFORMS (X,IX) SO THAT IX=0.
  19. C IF (X,IX) IS OUTSIDE THE ABOVE RANGE,
  20. C THEN DXRED TAKES NO ACTION.
  21. C THIS SUBROUTINE IS USEFUL IF THE
  22. C RESULTS OF EXTENDED-RANGE CALCULATIONS
  23. C ARE TO BE USED IN SUBSEQUENT ORDINARY
  24. C DOUBLE-PRECISION CALCULATIONS.
  25. C
  26. C***SEE ALSO DXSET
  27. C***REFERENCES (NONE)
  28. C***ROUTINES CALLED (NONE)
  29. C***COMMON BLOCKS DXBLK2
  30. C***REVISION HISTORY (YYMMDD)
  31. C 820712 DATE WRITTEN
  32. C 881020 Revised to meet SLATEC CML recommendations. (DWL and JMS)
  33. C 901019 Revisions to prologue. (DWL and WRB)
  34. C 901106 Changed all specific intrinsics to generic. (WRB)
  35. C Corrected order of sections in prologue and added TYPE
  36. C section. (WRB)
  37. C 920127 Revised PURPOSE section of prologue. (DWL)
  38. C***END PROLOGUE DXRED
  39. DOUBLE PRECISION X
  40. INTEGER IX
  41. DOUBLE PRECISION RADIX, RADIXL, RAD2L, DLG10R, XA
  42. INTEGER L, L2, KMAX
  43. COMMON /DXBLK2/ RADIX, RADIXL, RAD2L, DLG10R, L, L2, KMAX
  44. SAVE /DXBLK2/
  45. C
  46. C***FIRST EXECUTABLE STATEMENT DXRED
  47. IERROR=0
  48. IF (X.EQ.0.0D0) GO TO 90
  49. XA = ABS(X)
  50. IF (IX.EQ.0) GO TO 70
  51. IXA = ABS(IX)
  52. IXA1 = IXA/L2
  53. IXA2 = MOD(IXA,L2)
  54. IF (IX.GT.0) GO TO 40
  55. 10 CONTINUE
  56. IF (XA.GT.1.0D0) GO TO 20
  57. XA = XA*RAD2L
  58. IXA1 = IXA1 + 1
  59. GO TO 10
  60. 20 XA = XA/RADIX**IXA2
  61. IF (IXA1.EQ.0) GO TO 70
  62. DO 30 I=1,IXA1
  63. IF (XA.LT.1.0D0) GO TO 100
  64. XA = XA/RAD2L
  65. 30 CONTINUE
  66. GO TO 70
  67. C
  68. 40 CONTINUE
  69. IF (XA.LT.1.0D0) GO TO 50
  70. XA = XA/RAD2L
  71. IXA1 = IXA1 + 1
  72. GO TO 40
  73. 50 XA = XA*RADIX**IXA2
  74. IF (IXA1.EQ.0) GO TO 70
  75. DO 60 I=1,IXA1
  76. IF (XA.GT.1.0D0) GO TO 100
  77. XA = XA*RAD2L
  78. 60 CONTINUE
  79. 70 IF (XA.GT.RAD2L) GO TO 100
  80. IF (XA.GT.1.0D0) GO TO 80
  81. IF (RAD2L*XA.LT.1.0D0) GO TO 100
  82. 80 X = SIGN(XA,X)
  83. 90 IX = 0
  84. 100 RETURN
  85. END