67 DOUBLE PRECISION FUNCTION dlamch( CMACH )
77 DOUBLE PRECISION one, zero
78 parameter( one = 1.0d+0, zero = 0.0d+0 )
82 INTEGER beta, imax, imin, it
83 DOUBLE PRECISION base, emax, emin, eps, prec, rmach, rmax, rmin,
84 $ rnd, sfmin, small, t
94 SAVE first, eps, sfmin, base, t, rnd, emin, rmin,
103 CALL dlamc2( beta, it, lrnd, eps, imin, rmin, imax, rmax )
108 eps = ( base**( 1-it ) ) / 2
118 IF( small.GE.sfmin )
THEN 123 sfmin = small*( one+eps )
127 IF(
lsame( cmach,
'E' ) )
THEN 129 ELSE IF(
lsame( cmach,
'S' ) )
THEN 131 ELSE IF(
lsame( cmach,
'B' ) )
THEN 133 ELSE IF(
lsame( cmach,
'P' ) )
THEN 135 ELSE IF(
lsame( cmach,
'N' ) )
THEN 137 ELSE IF(
lsame( cmach,
'R' ) )
THEN 139 ELSE IF(
lsame( cmach,
'M' ) )
THEN 141 ELSE IF(
lsame( cmach,
'U' ) )
THEN 143 ELSE IF(
lsame( cmach,
'L' ) )
THEN 145 ELSE IF(
lsame( cmach,
'O' ) )
THEN 207 SUBROUTINE dlamc1( BETA, T, RND, IEEE1 )
219 LOGICAL FIRST, LIEEE1, LRND
221 DOUBLE PRECISION A, B, C, F, ONE, QTR, SAVEC, T1, T2
224 DOUBLE PRECISION DLAMC3
228 SAVE first, lieee1, lbeta, lrnd, lt
231 DATA first / .true. /
294 f = dlamc3( b / 2, -b / 100 )
301 f = dlamc3( b / 2, b / 100 )
303 IF( ( lrnd ) .AND. ( c.EQ.a ) )
312 t1 = dlamc3( b / 2, a )
313 t2 = dlamc3( b / 2, savec )
314 lieee1 = ( t1.EQ.a ) .AND. ( t2.GT.savec ) .AND. lrnd
418 SUBROUTINE dlamc2( BETA, T, RND, EPS, EMIN, RMIN, EMAX, RMAX )
425 INTEGER BETA, EMAX, EMIN, T
426 DOUBLE PRECISION EPS, RMAX, RMIN
431 LOGICAL FIRST, IEEE, IWARN, LIEEE1, LRND
432 INTEGER GNMIN, GPMIN, I, LBETA, LEMAX, LEMIN, LT,
434 DOUBLE PRECISION A, B, C, HALF, LEPS, LRMAX, LRMIN, ONE, RBASE,
435 $ sixth, small, third, two, zero
438 DOUBLE PRECISION DLAMC3
445 INTRINSIC abs, max, min
448 SAVE first, iwarn, lbeta, lemax, lemin, leps, lrmax,
452 DATA first / .true. / , iwarn / .false. /
470 CALL dlamc1( lbeta, lt, lrnd, lieee1 )
482 sixth = dlamc3( b, -half )
483 third = dlamc3( sixth, sixth )
484 b = dlamc3( third, -half )
485 b = dlamc3( b, sixth )
494 IF( ( leps.GT.b ) .AND. ( b.GT.zero ) )
THEN 496 c = dlamc3( half*leps, ( two**5 )*( leps**2 ) )
497 c = dlamc3( half, -c )
498 b = dlamc3( half, c )
499 c = dlamc3( half, -b )
500 b = dlamc3( half, c )
517 small = dlamc3( small*rbase, zero )
519 a = dlamc3( one, small )
520 CALL dlamc4( ngpmin, one, lbeta )
521 CALL dlamc4( ngnmin, -one, lbeta )
522 CALL dlamc4( gpmin, a, lbeta )
523 CALL dlamc4( gnmin, -a, lbeta )
526 IF( ( ngpmin.EQ.ngnmin ) .AND. ( gpmin.EQ.gnmin ) )
THEN 527 IF( ngpmin.EQ.gpmin )
THEN 531 ELSE IF( ( gpmin-ngpmin ).EQ.3 )
THEN 532 lemin = ngpmin - 1 + lt
537 lemin = min( ngpmin, gpmin )
542 ELSE IF( ( ngpmin.EQ.gpmin ) .AND. ( ngnmin.EQ.gnmin ) )
THEN 543 IF( abs( ngpmin-ngnmin ).EQ.1 )
THEN 544 lemin = max( ngpmin, ngnmin )
548 lemin = min( ngpmin, ngnmin )
553 ELSE IF( ( abs( ngpmin-ngnmin ).EQ.1 ) .AND.
554 $ ( gpmin.EQ.gnmin ) )
THEN 555 IF( ( gpmin-min( ngpmin, ngnmin ) ).EQ.3 )
THEN 556 lemin = max( ngpmin, ngnmin ) - 1 + lt
560 lemin = min( ngpmin, ngnmin )
566 lemin = min( ngpmin, ngnmin, gpmin, gnmin )
575 WRITE( 6, fmt = 9999 )lemin
584 ieee = ieee .OR. lieee1
591 DO 30 i = 1, 1 - lemin
592 lrmin = dlamc3( lrmin*rbase, zero )
597 CALL dlamc5( lbeta, lt, lemin, ieee, lemax, lrmax )
611 9999
FORMAT( / /
' WARNING. The value EMIN may be incorrect:-',
613 $
' If, after inspection, the value EMIN looks',
614 $
' acceptable please comment out ',
615 $ /
' the IF block as marked within the code of routine',
616 $
' DLAMC2,', /
' otherwise supply EMIN explicitly.', / )
641 DOUBLE PRECISION FUNCTION dlamc3( A, B )
647 DOUBLE PRECISION A, B
688 SUBROUTINE dlamc4( EMIN, START, BASE )
695 DOUBLE PRECISION START
701 DOUBLE PRECISION A, B1, B2, C1, C2, D1, D2, ONE, RBASE, ZERO
704 DOUBLE PRECISION DLAMC3
714 b1 = dlamc3( a*rbase, zero )
722 IF( ( c1.EQ.a ) .AND. ( c2.EQ.a ) .AND. ( d1.EQ.a ) .AND.
726 b1 = dlamc3( a / base, zero )
727 c1 = dlamc3( b1*base, zero )
732 b2 = dlamc3( a*rbase, zero )
733 c2 = dlamc3( b2 / rbase, zero )
795 SUBROUTINE dlamc5( BETA, P, EMIN, IEEE, EMAX, RMAX )
802 INTEGER BETA, EMAX, EMIN, P
803 DOUBLE PRECISION RMAX
808 DOUBLE PRECISION ZERO, ONE
809 parameter( zero = 0.0d0, one = 1.0d0 )
812 INTEGER EXBITS, EXPSUM, I, LEXP, NBITS, TRY, UEXP
813 DOUBLE PRECISION OLDY, RECBAS, Y, Z
816 DOUBLE PRECISION DLAMC3
833 IF( try.LE.( -emin ) )
THEN 838 IF( lexp.EQ.-emin )
THEN 849 IF( ( uexp+emin ).GT.( -lexp-emin ) )
THEN 858 emax = expsum + emin - 1
859 nbits = 1 + exbits + p
864 IF( ( mod( nbits, 2 ).EQ.1 ) .AND. ( beta.EQ.2 ) )
THEN 909 y = dlamc3( y*beta, zero )
logical function lsame(CA, CB)
LSAME
subroutine dlamc5(BETA, P, EMIN, IEEE, EMAX, RMAX)
DLAMC5
subroutine dlamc2(BETA, T, RND, EPS, EMIN, RMIN, EMAX, RMAX)
DLAMC2
double precision function dlamch(CMACH)
DLAMCH
subroutine dlamc4(EMIN, START, BASE)
DLAMC4
double precision function dlamc3(A, B)
DLAMC3
subroutine dlamc1(BETA, T, RND, IEEE1)
DLAMC1