NCEPLIBS-w3emc  2.11.0
q9ie32.f
Go to the documentation of this file.
1 C> @file
2 C> @brief Convert IBM370 F.P. to IEEE F.P.
3 C> @author Ralph Jones @date 1990-06-04
4 
5 C> Convert ibm370 32 bit floating point numbers to ieee
6 C> 32 bit task 754 floating point numbers.
7 C>
8 C> Program history log:
9 C> - Ralph Jones 1990-06-04 Change to sun fortran 1.3
10 C> - Ralph Jones 1990-07-14 Change ishft to lshift or lrshft
11 C> - Ralph Jones 1991-03-09 Change to silicongraphics fortran
12 C> - Ralph Jones 1992-07-20 Change to ibm aix xl fortran
13 C> - Ralph Jones 1995-11-15 Add save statement
14 C> - Stephen Gilbert 1998-11-15 Specified 4-byte integers for IBM SP
15 C>
16 C> @param[in] A REAL*4 Array of ibm370 32 bit floating point numbers.
17 C> @param[out] N Number of points to convert.
18 C> @param[out] B REAL*4 Array of ieee 32 bit floating point numbers.
19 C> @param[out] ISTAT Number of point greater than 10e+38, numbers are set to
20 c> ieee infinity, one is added to istat. Numbers less than
21 c> e-38 are set to zero, one is not added to istat.
22 C>
23 C> @note See ieee task 754 standard floating point arithmetic
24 C> for more information about IEEE F.P.
25 C>
26 C> @author Ralph Jones @date 1990-06-04
27  SUBROUTINE q9ie32(A,B,N,ISTAT)
28 C
29  INTEGER(4) A(*)
30  INTEGER(4) B(*)
31  INTEGER(4) SIGN
32  INTEGER(4) INFIN,MASKFR,MASKSN,MASK21,MASK22,MASK23
33  INTEGER(4) ITEMP,ISIGN,IEEEXP,K,LTEMP
34 C
35  SAVE
36 C
37  DATA infin /z'7F800000'/
38  DATA maskfr/z'007FFFFF'/
39  DATA masksn/z'7FFFFFFF'/
40  DATA mask21/z'00200000'/
41  DATA mask22/z'00400000'/
42  DATA mask23/z'00800000'/
43  DATA sign /z'80000000'/
44 C
45  IF (n.LT.1) THEN
46  istat = -1
47  RETURN
48  ENDIF
49 C
50  istat = 0
51 C
52  DO 40 i = 1,n
53  isign = 0
54  itemp = a(i)
55 C
56 C TEST SIGN BIT
57 C
58  IF (itemp.EQ.0) GO TO 30
59 C
60  IF (itemp.LT.0) THEN
61 C
62  isign = sign
63 C
64 C SET SIGN BIT TO ZERO
65 C
66  itemp = iand(itemp,masksn)
67 C
68  END IF
69 C
70 C
71 C CONVERT IBM EXPONENT TO IEEE EXPONENT
72 C
73  ieeexp = (ishft(itemp,-24_4) - 64_4) * 4 + 126
74 C
75  k = 0
76 C
77 C TEST BIT 23, 22, 21
78 C ADD UP NUMBER OF ZERO BITS IN FRONT OF IBM370 FRACTION
79 C
80  IF (iand(itemp,mask23).NE.0) GO TO 10
81  k = k + 1
82  IF (iand(itemp,mask22).NE.0) GO TO 10
83  k = k + 1
84  IF (iand(itemp,mask21).NE.0) GO TO 10
85  k = k + 1
86 C
87  10 CONTINUE
88 C
89 C SUBTRACT ZERO BITS FROM EXPONENT
90 C
91  ieeexp = ieeexp - k
92 C
93 C TEST FOR OVERFLOW
94 C
95  IF (ieeexp.GT.254) GO TO 20
96 C
97 C TEST FOR UNDERFLOW
98 C
99  IF (ieeexp.LT.1) GO TO 30
100 C
101 C SHIFT IEEE EXPONENT TO BITS 1 TO 8
102 C
103  ltemp = ishft(ieeexp,23_4)
104 C
105 C SHIFT IBM370 FRACTION LEFT K BIT, AND OUT BITS 0 - 8
106 C OR TOGETHER THE EXPONENT AND THE FRACTION
107 C OR IN SIGN BIT
108 C
109  b(i) = ior(ior(iand(ishft(itemp,k),maskfr),ltemp),isign)
110 C
111  GO TO 40
112 C
113  20 CONTINUE
114 C
115 C OVERFLOW , SET TO IEEE INFINITY, ADD 1 TO OVERFLOW COUNTER
116 C
117  istat = istat + 1
118  b(i) = ior(infin,isign)
119  GO TO 40
120 C
121  30 CONTINUE
122 C
123 C UNDERFLOW , SET TO ZERO
124 C
125  b(i) = 0
126 C
127  40 CONTINUE
128 C
129  RETURN
130  END
subroutine q9ie32(A, B, N, ISTAT)
Convert ibm370 32 bit floating point numbers to ieee 32 bit task 754 floating point numbers.
Definition: q9ie32.f:28