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
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 )