867
868
869
870
871
872
873
874 CHARACTER CMACH
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914 REAL ONE, ZERO
915 parameter( one = 1.0e+0, zero = 0.0e+0 )
916
917
918 LOGICAL FIRST, LRND
919 INTEGER BETA, IMAX, IMIN, IT
920 REAL BASE, EMAX, EMIN, EPS, PREC, RMACH, RMAX, RMIN,
921 $ RND, SFMIN, SMALL, T
922
923
924 LOGICAL LSAME
926
927
929
930
931 SAVE first, eps, sfmin, base, t, rnd, emin, rmin,
932 $ emax, rmax, prec
933
934
935 DATA first / .true. /
936
937
938
939 IF( first ) THEN
940 first = .false.
941 CALL slamc2( beta, it, lrnd, eps, imin, rmin, imax, rmax )
942 base = beta
943 t = it
944 IF( lrnd ) THEN
945 rnd = one
946 eps = ( base**( 1-it ) ) / 2
947 ELSE
948 rnd = zero
949 eps = base**( 1-it )
950 END IF
951 prec = eps*base
952 emin = imin
953 emax = imax
954 sfmin = rmin
955 small = one / rmax
956 IF( small.GE.sfmin ) THEN
957
958
959
960
961 sfmin = small*( one+eps )
962 END IF
963 END IF
964
965 IF(
lsame( cmach,
'E' ) )
THEN
966 rmach = eps
967 ELSE IF(
lsame( cmach,
'S' ) )
THEN
968 rmach = sfmin
969 ELSE IF(
lsame( cmach,
'B' ) )
THEN
970 rmach = base
971 ELSE IF(
lsame( cmach,
'P' ) )
THEN
972 rmach = prec
973 ELSE IF(
lsame( cmach,
'N' ) )
THEN
974 rmach = t
975 ELSE IF(
lsame( cmach,
'R' ) )
THEN
976 rmach = rnd
977 ELSE IF(
lsame( cmach,
'M' ) )
THEN
978 rmach = emin
979 ELSE IF(
lsame( cmach,
'U' ) )
THEN
980 rmach = rmin
981 ELSE IF(
lsame( cmach,
'L' ) )
THEN
982 rmach = emax
983 ELSE IF(
lsame( cmach,
'O' ) )
THEN
984 rmach = rmax
985 END IF
986
988 RETURN
989
990
991