132
133
134
135
136
137
138
139 LOGICAL IEEE1, RND
140 INTEGER BETA, T
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184 LOGICAL FIRST, LIEEE1, LRND
185 INTEGER LBETA, LT
186 DOUBLE PRECISION A, B, C, F, ONE, QTR, SAVEC, T1, T2
187
188
189 DOUBLE PRECISION DLAMC3
191
192
193 SAVE first, lieee1, lbeta, lrnd, lt
194
195
196 DATA first / .true. /
197
198
199
200 IF( first ) THEN
201 first = .false.
202 one = 1
203
204
205
206
207
208
209
210
211
212
213
214
215
216 a = 1
217 c = 1
218
219
220 10 CONTINUE
221 IF( c.EQ.one ) THEN
222 a = 2*a
225 GO TO 10
226 END IF
227
228
229
230
231
232
233
234 b = 1
236
237
238 20 CONTINUE
239 IF( c.EQ.a ) THEN
240 b = 2*b
242 GO TO 20
243 END IF
244
245
246
247
248
249
250
251 qtr = one / 4
252 savec = c
254 lbeta = c + qtr
255
256
257
258
259 b = lbeta
260 f =
dlamc3( b / 2, -b / 100 )
262 IF( c.EQ.a ) THEN
263 lrnd = .true.
264 ELSE
265 lrnd = .false.
266 END IF
267 f =
dlamc3( b / 2, b / 100 )
269 IF( ( lrnd ) .AND. ( c.EQ.a ) )
270 $ lrnd = .false.
271
272
273
274
275
276
277
279 t2 =
dlamc3( b / 2, savec )
280 lieee1 = ( t1.EQ.a ) .AND. ( t2.GT.savec ) .AND. lrnd
281
282
283
284
285
286
287
288
289 lt = 0
290 a = 1
291 c = 1
292
293
294 30 CONTINUE
295 IF( c.EQ.one ) THEN
296 lt = lt + 1
297 a = a*lbeta
300 GO TO 30
301 END IF
302
303
304 END IF
305
306 beta = lbeta
307 t = lt
308 rnd = lrnd
309 ieee1 = lieee1
310 RETURN
311
312
313