327
328
329
330
331
332
333
334 LOGICAL RND
335 INTEGER BETA, EMAX, EMIN, T
336 DOUBLE PRECISION EPS, RMAX, RMIN
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392 LOGICAL FIRST, IEEE, IWARN, LIEEE1, LRND
393 INTEGER GNMIN, GPMIN, I, LBETA, LEMAX, LEMIN, LT,
394 $ NGNMIN, NGPMIN
395 DOUBLE PRECISION A, B, C, HALF, LEPS, LRMAX, LRMIN, ONE, RBASE,
396 $ SIXTH, SMALL, THIRD, TWO, ZERO
397
398
399 DOUBLE PRECISION DLAMC3
401
402
404
405
407
408
409 SAVE first, iwarn, lbeta, lemax, lemin, leps, lrmax,
410 $ lrmin, lt
411
412
413 DATA first / .true. / , iwarn / .false. /
414
415
416
417 IF( first ) THEN
418 first = .false.
419 zero = 0
420 one = 1
421 two = 2
422
423
424
425
426
427
428
429
430
431
432 CALL dlamc1( lbeta, lt, lrnd, lieee1 )
433
434
435
436 b = lbeta
437 a = b**( -lt )
438 leps = a
439
440
441
442 b = two / 3
443 half = one / 2
444 sixth =
dlamc3( b, -half )
445 third =
dlamc3( sixth, sixth )
446 b =
dlamc3( third, -half )
448 b = abs( b )
449 IF( b.LT.leps )
450 $ b = leps
451
452 leps = 1
453
454
455 10 CONTINUE
456 IF( ( leps.GT.b ) .AND. ( b.GT.zero ) ) THEN
457 leps = b
458 c =
dlamc3( half*leps, ( two**5 )*( leps**2 ) )
463 GO TO 10
464 END IF
465
466
467 IF( a.LT.leps )
468 $ leps = a
469
470
471
472
473
474
475
476 rbase = one / lbeta
477 small = one
478 DO 20 i = 1, 3
479 small =
dlamc3( small*rbase, zero )
480 20 CONTINUE
482 CALL dlamc4( ngpmin, one, lbeta )
483 CALL dlamc4( ngnmin, -one, lbeta )
484 CALL dlamc4( gpmin, a, lbeta )
485 CALL dlamc4( gnmin, -a, lbeta )
486 ieee = .false.
487
488 IF( ( ngpmin.EQ.ngnmin ) .AND. ( gpmin.EQ.gnmin ) ) THEN
489 IF( ngpmin.EQ.gpmin ) THEN
490 lemin = ngpmin
491
492
493 ELSE IF( ( gpmin-ngpmin ).EQ.3 ) THEN
494 lemin = ngpmin - 1 + lt
495 ieee = .true.
496
497
498 ELSE
499 lemin =
min( ngpmin, gpmin )
500
501 iwarn = .true.
502 END IF
503
504 ELSE IF( ( ngpmin.EQ.gpmin ) .AND. ( ngnmin.EQ.gnmin ) ) THEN
505 IF( abs( ngpmin-ngnmin ).EQ.1 ) THEN
506 lemin =
max( ngpmin, ngnmin )
507
508
509 ELSE
510 lemin =
min( ngpmin, ngnmin )
511
512 iwarn = .true.
513 END IF
514
515 ELSE IF( ( abs( ngpmin-ngnmin ).EQ.1 ) .AND.
516 $ ( gpmin.EQ.gnmin ) ) THEN
517 IF( ( gpmin-
min( ngpmin, ngnmin ) ).EQ.3 )
THEN
518 lemin =
max( ngpmin, ngnmin ) - 1 + lt
519
520
521 ELSE
522 lemin =
min( ngpmin, ngnmin )
523
524 iwarn = .true.
525 END IF
526
527 ELSE
528 lemin =
min( ngpmin, ngnmin, gpmin, gnmin )
529
530 iwarn = .true.
531 END IF
532
533
534 IF( iwarn ) THEN
535 first = .true.
536 WRITE( 6, fmt = 9999 )lemin
537 END IF
538
539
540
541
542
543
544
545 ieee = ieee .OR. lieee1
546
547
548
549
550
551 lrmin = 1
552 DO 30 i = 1, 1 - lemin
553 lrmin =
dlamc3( lrmin*rbase, zero )
554 30 CONTINUE
555
556
557
558 CALL dlamc5( lbeta, lt, lemin, ieee, lemax, lrmax )
559 END IF
560
561 beta = lbeta
562 t = lt
563 rnd = lrnd
564 eps = leps
565 emin = lemin
566 rmin = lrmin
567 emax = lemax
568 rmax = lrmax
569
570 RETURN
571
572 9999 FORMAT( / / ' WARNING. The value EMIN may be incorrect:-',
573 $ ' EMIN = ', i8, /
574 $ ' If, after inspection, the value EMIN looks',
575 $ ' acceptable please comment out ',
576 $ / ' the IF block as marked within the code of routine',
577 $ ' DLAMC2,', / ' otherwise supply EMIN explicitly.', / )
578
579
580