66 REAL FUNCTION slamch( CMACH )
77 parameter( one = 1.0e+0, zero = 0.0e+0 )
81 INTEGER beta, imax, imin, it
82 REAL base, emax, emin, eps, prec, rmach, rmax, rmin,
83 $ rnd, sfmin, small, t
93 SAVE first, eps, sfmin, base, t, rnd, emin, rmin,
102 CALL slamc2( beta, it, lrnd, eps, imin, rmin, imax, rmax )
107 eps = ( base**( 1-it ) ) / 2
117 IF( small.GE.sfmin )
THEN 122 sfmin = small*( one+eps )
126 IF(
lsame( cmach,
'E' ) )
THEN 128 ELSE IF(
lsame( cmach,
'S' ) )
THEN 130 ELSE IF(
lsame( cmach,
'B' ) )
THEN 132 ELSE IF(
lsame( cmach,
'P' ) )
THEN 134 ELSE IF(
lsame( cmach,
'N' ) )
THEN 136 ELSE IF(
lsame( cmach,
'R' ) )
THEN 138 ELSE IF(
lsame( cmach,
'M' ) )
THEN 140 ELSE IF(
lsame( cmach,
'U' ) )
THEN 142 ELSE IF(
lsame( cmach,
'L' ) )
THEN 144 ELSE IF(
lsame( cmach,
'O' ) )
THEN 206 SUBROUTINE slamc1( BETA, T, RND, IEEE1 )
218 LOGICAL FIRST, LIEEE1, LRND
220 REAL A, B, C, F, ONE, QTR, SAVEC, T1, T2
227 SAVE first, lieee1, lbeta, lrnd, lt
230 DATA first / .true. /
293 f = slamc3( b / 2, -b / 100 )
300 f = slamc3( b / 2, b / 100 )
302 IF( ( lrnd ) .AND. ( c.EQ.a ) )
311 t1 = slamc3( b / 2, a )
312 t2 = slamc3( b / 2, savec )
313 lieee1 = ( t1.EQ.a ) .AND. ( t2.GT.savec ) .AND. lrnd
418 SUBROUTINE slamc2( BETA, T, RND, EPS, EMIN, RMIN, EMAX, RMAX )
425 INTEGER BETA, EMAX, EMIN, T
431 LOGICAL FIRST, IEEE, IWARN, LIEEE1, LRND
432 INTEGER GNMIN, GPMIN, I, LBETA, LEMAX, LEMIN, LT,
434 REAL A, B, C, HALF, LEPS, LRMAX, LRMIN, ONE, RBASE,
435 $ sixth, small, third, two, zero
445 INTRINSIC abs, max, min
448 SAVE first, iwarn, lbeta, lemax, lemin, leps, lrmax,
452 DATA first / .true. / , iwarn / .false. /
470 CALL slamc1( lbeta, lt, lrnd, lieee1 )
482 sixth = slamc3( b, -half )
483 third = slamc3( sixth, sixth )
484 b = slamc3( third, -half )
485 b = slamc3( b, sixth )
494 IF( ( leps.GT.b ) .AND. ( b.GT.zero ) )
THEN 496 c = slamc3( half*leps, ( two**5 )*( leps**2 ) )
497 c = slamc3( half, -c )
498 b = slamc3( half, c )
499 c = slamc3( half, -b )
500 b = slamc3( half, c )
517 small = slamc3( small*rbase, zero )
519 a = slamc3( one, small )
520 CALL slamc4( ngpmin, one, lbeta )
521 CALL slamc4( ngnmin, -one, lbeta )
522 CALL slamc4( gpmin, a, lbeta )
523 CALL slamc4( 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 = slamc3( lrmin*rbase, zero )
597 CALL slamc5( 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 $
' SLAMC2,', /
' otherwise supply EMIN explicitly.', / )
641 REAL FUNCTION slamc3( A, B )
688 SUBROUTINE slamc4( EMIN, START, BASE )
702 REAL A, B1, B2, C1, C2, D1, D2, ONE, RBASE, ZERO
715 b1 = slamc3( a*rbase, zero )
723 IF( ( c1.EQ.a ) .AND. ( c2.EQ.a ) .AND. ( d1.EQ.a ) .AND.
727 b1 = slamc3( a / base, zero )
728 c1 = slamc3( b1*base, zero )
733 b2 = slamc3( a*rbase, zero )
734 c2 = slamc3( b2 / rbase, zero )
796 SUBROUTINE slamc5( BETA, P, EMIN, IEEE, EMAX, RMAX )
803 INTEGER BETA, EMAX, EMIN, P
810 parameter( zero = 0.0e0, one = 1.0e0 )
813 INTEGER EXBITS, EXPSUM, I, LEXP, NBITS, TRY, UEXP
814 REAL OLDY, RECBAS, Y, Z
834 IF( try.LE.( -emin ) )
THEN 839 IF( lexp.EQ.-emin )
THEN 850 IF( ( uexp+emin ).GT.( -lexp-emin ) )
THEN 859 emax = expsum + emin - 1
860 nbits = 1 + exbits + p
865 IF( ( mod( nbits, 2 ).EQ.1 ) .AND. ( beta.EQ.2 ) )
THEN 910 y = slamc3( y*beta, zero )
logical function lsame(CA, CB)
LSAME
subroutine slamc5(BETA, P, EMIN, IEEE, EMAX, RMAX)
SLAMC5
subroutine slamc1(BETA, T, RND, IEEE1)
SLAMC1
real function slamc3(A, B)
SLAMC3
real function slamch(CMACH)
SLAMCH
subroutine slamc4(EMIN, START, BASE)
SLAMC4
subroutine slamc2(BETA, T, RND, EPS, EMIN, RMIN, EMAX, RMAX)
SLAMC2