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
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
417 SUBROUTINE slamc2( BETA, T, RND, EPS, EMIN, RMIN, EMAX, RMAX )
424 INTEGER BETA, EMAX, EMIN, T
430 LOGICAL FIRST, IEEE, IWARN, LIEEE1, LRND
431 INTEGER GNMIN, GPMIN, I, LBETA, LEMAX, LEMIN, LT,
433 REAL A, B, C, HALF, LEPS, LRMAX, LRMIN, ONE, RBASE,
434 $ SIXTH, SMALL, THIRD, TWO, ZERO
444 INTRINSIC abs, max, min
447 SAVE first, iwarn, lbeta, lemax, lemin, leps, lrmax,
451 DATA first / .true. / , iwarn / .false. /
469 CALL slamc1( lbeta, lt, lrnd, lieee1 )
481 sixth = slamc3( b, -half )
482 third = slamc3( sixth, sixth )
483 b = slamc3( third, -half )
484 b = slamc3( b, sixth )
493 IF( ( leps.GT.b ) .AND. ( b.GT.zero ) )
THEN
495 c = slamc3( half*leps, ( two**5 )*( leps**2 ) )
496 c = slamc3( half, -c )
497 b = slamc3( half, c )
498 c = slamc3( half, -b )
499 b = slamc3( half, c )
516 small = slamc3( small*rbase, zero )
518 a = slamc3( one, small )
519 CALL slamc4( ngpmin, one, lbeta )
520 CALL slamc4( ngnmin, -one, lbeta )
521 CALL slamc4( gpmin, a, lbeta )
522 CALL slamc4( gnmin, -a, lbeta )
525 IF( ( ngpmin.EQ.ngnmin ) .AND. ( gpmin.EQ.gnmin ) )
THEN
526 IF( ngpmin.EQ.gpmin )
THEN
530 ELSE IF( ( gpmin-ngpmin ).EQ.3 )
THEN
531 lemin = ngpmin - 1 + lt
536 lemin = min( ngpmin, gpmin )
541 ELSE IF( ( ngpmin.EQ.gpmin ) .AND. ( ngnmin.EQ.gnmin ) )
THEN
542 IF( abs( ngpmin-ngnmin ).EQ.1 )
THEN
543 lemin = max( ngpmin, ngnmin )
547 lemin = min( ngpmin, ngnmin )
552 ELSE IF( ( abs( ngpmin-ngnmin ).EQ.1 ) .AND.
553 $ ( gpmin.EQ.gnmin ) )
THEN
554 IF( ( gpmin-min( ngpmin, ngnmin ) ).EQ.3 )
THEN
555 lemin = max( ngpmin, ngnmin ) - 1 + lt
559 lemin = min( ngpmin, ngnmin )
565 lemin = min( ngpmin, ngnmin, gpmin, gnmin )
574 WRITE( 6, fmt = 9999 )lemin
583 ieee = ieee .OR. lieee1
590 DO 30 i = 1, 1 - lemin
591 lrmin = slamc3( lrmin*rbase, zero )
596 CALL slamc5( lbeta, lt, lemin, ieee, lemax, lrmax )
610 9999
FORMAT( / /
' WARNING. The value EMIN may be incorrect:-',
612 $
' If, after inspection, the value EMIN looks',
613 $
' acceptable please comment out ',
614 $ /
' the IF block as marked within the code of routine',
615 $
' SLAMC2,', /
' otherwise supply EMIN explicitly.', / )
699 REAL A, B1, B2, C1, C2, D1, D2, ONE, RBASE, ZERO
712 b1 = slamc3( a*rbase, zero )
720 IF( ( c1.EQ.a ) .AND. ( c2.EQ.a ) .AND. ( d1.EQ.a ) .AND.
724 b1 = slamc3( a / base, zero )
725 c1 = slamc3( b1*base, zero )
730 b2 = slamc3( a*rbase, zero )
731 c2 = slamc3( b2 / rbase, zero )
792 SUBROUTINE slamc5( BETA, P, EMIN, IEEE, EMAX, RMAX )
799 INTEGER BETA, EMAX, EMIN, P
806 parameter( zero = 0.0e0, one = 1.0e0 )
809 INTEGER EXBITS, EXPSUM, I, LEXP, NBITS, TRY, UEXP
810 REAL OLDY, RECBAS, Y, Z
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 = slamc3( y*beta, zero )
logical function lsame(CA, CB)
LSAME
real function slamc3(A, B)
SLAMC3
real function slamch(CMACH)
SLAMCH
subroutine slamc1(BETA, T, RND, IEEE1)
SLAMC1
subroutine slamc5(BETA, P, EMIN, IEEE, EMAX, RMAX)
SLAMC5
subroutine slamc2(BETA, T, RND, EPS, EMIN, RMIN, EMAX, RMAX)
SLAMC2
subroutine slamc4(EMIN, START, BASE)
SLAMC4