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
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.', / )
646 DOUBLE PRECISION a, b
693 DOUBLE PRECISION START
699 DOUBLE PRECISION A, B1, B2, C1, C2, D1, D2, ONE, RBASE, ZERO
702 DOUBLE PRECISION DLAMC3
712 b1 = dlamc3( a*rbase, zero )
720 IF( ( c1.EQ.a ) .AND. ( c2.EQ.a ) .AND. ( d1.EQ.a ) .AND.
724 b1 = dlamc3( a / base, zero )
725 c1 = dlamc3( b1*base, zero )
730 b2 = dlamc3( a*rbase, zero )
731 c2 = dlamc3( b2 / rbase, zero )
792 SUBROUTINE dlamc5( BETA, P, EMIN, IEEE, EMAX, RMAX )
799 INTEGER BETA, EMAX, EMIN, P
800 DOUBLE PRECISION RMAX
805 DOUBLE PRECISION ZERO, ONE
806 parameter( zero = 0.0d0, one = 1.0d0 )
809 INTEGER EXBITS, EXPSUM, I, LEXP, NBITS, TRY, UEXP
810 DOUBLE PRECISION OLDY, RECBAS, Y, Z
813 DOUBLE PRECISION DLAMC3
830 IF( try.LE.( -emin ) )
THEN
835 IF( lexp.EQ.-emin )
THEN
846 IF( ( uexp+emin ).GT.( -lexp-emin ) )
THEN
855 emax = expsum + emin - 1
856 nbits = 1 + exbits + p
861 IF( ( mod( nbits, 2 ).EQ.1 ) .AND. ( beta.EQ.2 ) )
THEN
906 y = dlamc3( y*beta, zero )
double precision function dlamch(CMACH)
DLAMCH
double precision function dlamc3(A, B)
DLAMC3
subroutine dlamc2(BETA, T, RND, EPS, EMIN, RMIN, EMAX, RMAX)
DLAMC2
subroutine dlamc5(BETA, P, EMIN, IEEE, EMAX, RMAX)
DLAMC5
subroutine dlamc1(BETA, T, RND, IEEE1)
DLAMC1
subroutine dlamc4(EMIN, START, BASE)
DLAMC4
logical function lsame(CA, CB)
LSAME