00001 SUBROUTINE SGET10( M, N, A, LDA, B, LDB, WORK, RESULT )
00002
00003
00004
00005
00006
00007
00008 INTEGER LDA, LDB, M, N
00009 REAL RESULT
00010
00011
00012 REAL A( LDA, * ), B( LDB, * ), WORK( * )
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050 REAL ONE, ZERO
00051 PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 )
00052
00053
00054 INTEGER J
00055 REAL ANORM, EPS, UNFL, WNORM
00056
00057
00058 REAL SASUM, SLAMCH, SLANGE
00059 EXTERNAL SASUM, SLAMCH, SLANGE
00060
00061
00062 EXTERNAL SAXPY, SCOPY
00063
00064
00065 INTRINSIC MAX, MIN, REAL
00066
00067
00068
00069
00070
00071 IF( M.LE.0 .OR. N.LE.0 ) THEN
00072 RESULT = ZERO
00073 RETURN
00074 END IF
00075
00076 UNFL = SLAMCH( 'Safe minimum' )
00077 EPS = SLAMCH( 'Precision' )
00078
00079 WNORM = ZERO
00080 DO 10 J = 1, N
00081 CALL SCOPY( M, A( 1, J ), 1, WORK, 1 )
00082 CALL SAXPY( M, -ONE, B( 1, J ), 1, WORK, 1 )
00083 WNORM = MAX( WNORM, SASUM( N, WORK, 1 ) )
00084 10 CONTINUE
00085
00086 ANORM = MAX( SLANGE( '1', M, N, A, LDA, WORK ), UNFL )
00087
00088 IF( ANORM.GT.WNORM ) THEN
00089 RESULT = ( WNORM / ANORM ) / ( M*EPS )
00090 ELSE
00091 IF( ANORM.LT.ONE ) THEN
00092 RESULT = ( MIN( WNORM, M*ANORM ) / ANORM ) / ( M*EPS )
00093 ELSE
00094 RESULT = MIN( WNORM / ANORM, REAL( M ) ) / ( M*EPS )
00095 END IF
00096 END IF
00097
00098 RETURN
00099
00100
00101
00102 END