154 SUBROUTINE sget54( N, A, LDA, B, LDB, S, LDS, T, LDT, U, LDU, V,
155 $ LDV, WORK, RESULT )
162 INTEGER LDA, LDB, LDS, LDT, LDU, LDV, N
166 REAL A( LDA, * ), B( LDB, * ), S( LDS, * ),
167 $ t( ldt, * ), u( ldu, * ), v( ldv, * ),
175 parameter( zero = 0.0e+0, one = 1.0e+0 )
178 REAL ABNORM, ULP, UNFL, WNORM
185 EXTERNAL slamch, slange
191 INTRINSIC max, min, real
201 unfl = slamch(
'Safe minimum' )
202 ulp = slamch(
'Epsilon' )*slamch(
'Base' )
206 CALL slacpy(
'Full', n, n, a, lda, work, n )
207 CALL slacpy(
'Full', n, n, b, ldb, work( n*n+1 ), n )
208 abnorm = max( slange(
'1', n, 2*n, work, n, dum ), unfl )
212 CALL slacpy(
' ', n, n, a, lda, work, n )
213 CALL sgemm(
'N',
'N', n, n, n, one, u, ldu, s, lds, zero,
216 CALL sgemm(
'N',
'C', n, n, n, -one, work( n*n+1 ), n, v, ldv,
221 CALL slacpy(
' ', n, n, b, ldb, work( n*n+1 ), n )
222 CALL sgemm(
'N',
'N', n, n, n, one, u, ldu, t, ldt, zero,
223 $ work( 2*n*n+1 ), n )
225 CALL sgemm(
'N',
'C', n, n, n, -one, work( 2*n*n+1 ), n, v, ldv,
226 $ one, work( n*n+1 ), n )
230 wnorm = slange(
'1', n, 2*n, work, n, dum )
232 IF( abnorm.GT.wnorm )
THEN
233 result = ( wnorm / abnorm ) / ( 2*n*ulp )
235 IF( abnorm.LT.one )
THEN
236 result = ( min( wnorm, 2*n*abnorm ) / abnorm ) / ( 2*n*ulp )
238 result = min( wnorm / abnorm, real( 2*n ) ) / ( 2*n*ulp )
subroutine sgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
SGEMM
subroutine sget54(n, a, lda, b, ldb, s, lds, t, ldt, u, ldu, v, ldv, work, result)
SGET54