2
SUBROUTINE XADD (X, IX, Y, IY, Z, IZ, IERROR)
3
C***BEGIN PROLOGUE XADD
4
C***PURPOSE To provide single-precision floating-point arithmetic
5
C with an extended exponent range.
8
C***TYPE SINGLE PRECISION (XADD-S, DXADD-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)
16
C FORMS THE EXTENDED-RANGE SUM (Z,IZ) =
17
C (X,IX) + (Y,IY). (Z,IZ) IS ADJUSTED
18
C BEFORE RETURNING. THE INPUT OPERANDS
19
C NEED NOT BE IN ADJUSTED FORM, BUT THEIR
20
C PRINCIPAL PARTS MUST SATISFY
21
C RADIX**(-2L).LE.ABS(X).LE.RADIX**(2L),
22
C RADIX**(-2L).LE.ABS(Y).LE.RADIX**(2L).
26
C***ROUTINES CALLED XADJ
27
C***COMMON BLOCKS XBLK2
28
C***REVISION HISTORY (YYMMDD)
30
C 881020 Revised to meet SLATEC CML recommendations. (DWL and JMS)
31
C 901019 Revisions to prologue. (DWL and WRB)
32
C 901106 Changed all specific intrinsics to generic. (WRB)
33
C Corrected order of sections in prologue and added TYPE
35
C 920127 Revised PURPOSE section of prologue. (DWL)
39
REAL RADIX, RADIXL, RAD2L, DLG10R
41
COMMON /XBLK2/ RADIX, RADIXL, RAD2L, DLG10R, L, L2, KMAX
45
C THE CONDITIONS IMPOSED ON L AND KMAX BY THIS SUBROUTINE
47
C (1) 1 .LT. L .LE. 0.5*LOGR(0.5*DZERO)
49
C (2) NRADPL .LT. L .LE. KMAX/6
51
C (3) KMAX .LE. (2**NBITS - 4*L - 1)/2
53
C THESE CONDITIONS MUST BE MET BY APPROPRIATE CODING
56
C***FIRST EXECUTABLE STATEMENT XADD
58
IF (X.NE.0.0) GO TO 10
62
10 IF (Y.NE.0.0) GO TO 20
67
IF (IX.GE.0 .AND. IY.GE.0) GO TO 40
68
IF (IX.LT.0 .AND. IY.LT.0) GO TO 40
69
IF (ABS(IX).LE.6*L .AND. ABS(IY).LE.6*L) GO TO 40
80
50 IF (ABS(X).GT.1.0 .AND. ABS(Y).GT.1.0) GO TO 60
81
IF (ABS(X).LT.1.0 .AND. ABS(Y).LT.1.0) GO TO 70
104
C AT THIS POINT, THE ONE OF (X,IX) OR (Y,IY) THAT HAS THE
105
C LARGER AUXILIARY INDEX IS STORED IN (S,IS). THE PRINCIPAL
106
C PART OF THE OTHER INPUT IS STORED IN T.
110
IF (ABS(T).GE.RADIXL) GO TO 130
111
IF (ABS(T).GE.1.0) GO TO 120
112
IF (RADIXL*ABS(T).GE.1.0) GO TO 110
120
IF (J.LT.0) GO TO 110
121
T = T*RADIX**(-I2)/RADIXL
124
IF (J.LT.0) GO TO 120
125
T = T*RADIX**(-I2)/RAD2L
128
C AT THIS POINT, SOME OR ALL OF THE DIFFERENCE IN THE
129
C AUXILIARY INDICES HAS BEEN USED TO EFFECT A LEFT SHIFT
130
C OF T. THE SHIFTED VALUE OF T SATISFIES
132
C RADIX**(-2*L) .LE. ABS(T) .LE. 1.0
134
C AND, IF J=0, NO FURTHER SHIFTING REMAINS TO BE DONE.
136
IF (J.EQ.0) GO TO 190
137
IF (ABS(S).GE.RADIXL .OR. J.GT.3) GO TO 150
138
IF (ABS(S).GE.1.0) GO TO (180, 150, 150), J
139
IF (RADIXL*ABS(S).GE.1.0) GO TO (180, 170, 150), J
140
GO TO (180, 170, 160), J
149
C AT THIS POINT, THE REMAINING DIFFERENCE IN THE
150
C AUXILIARY INDICES HAS BEEN USED TO EFFECT A RIGHT SHIFT
151
C OF S. IF THE SHIFTED VALUE OF S WOULD HAVE EXCEEDED
152
C RADIX**L, THEN (S,IS) IS RETURNED AS THE VALUE OF THE
155
IF (ABS(S).GT.1.0 .AND. ABS(T).GT.1.0) GO TO 200
156
IF (ABS(S).LT.1.0 .AND. ABS(T).LT.1.0) GO TO 210
169
220 CALL XADJ(Z, IZ,IERROR)