1*> \brief \b SLAS2 computes singular values of a 2-by-2 triangular matrix. 2* 3* =========== DOCUMENTATION =========== 4* 5* Online html documentation available at 6* http://www.netlib.org/lapack/explore-html/ 7* 8*> \htmlonly 9*> Download SLAS2 + dependencies 10*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/slas2.f"> 11*> [TGZ]</a> 12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/slas2.f"> 13*> [ZIP]</a> 14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/slas2.f"> 15*> [TXT]</a> 16*> \endhtmlonly 17* 18* Definition: 19* =========== 20* 21* SUBROUTINE SLAS2( F, G, H, SSMIN, SSMAX ) 22* 23* .. Scalar Arguments .. 24* REAL F, G, H, SSMAX, SSMIN 25* .. 26* 27* 28*> \par Purpose: 29* ============= 30*> 31*> \verbatim 32*> 33*> SLAS2 computes the singular values of the 2-by-2 matrix 34*> [ F G ] 35*> [ 0 H ]. 36*> On return, SSMIN is the smaller singular value and SSMAX is the 37*> larger singular value. 38*> \endverbatim 39* 40* Arguments: 41* ========== 42* 43*> \param[in] F 44*> \verbatim 45*> F is REAL 46*> The (1,1) element of the 2-by-2 matrix. 47*> \endverbatim 48*> 49*> \param[in] G 50*> \verbatim 51*> G is REAL 52*> The (1,2) element of the 2-by-2 matrix. 53*> \endverbatim 54*> 55*> \param[in] H 56*> \verbatim 57*> H is REAL 58*> The (2,2) element of the 2-by-2 matrix. 59*> \endverbatim 60*> 61*> \param[out] SSMIN 62*> \verbatim 63*> SSMIN is REAL 64*> The smaller singular value. 65*> \endverbatim 66*> 67*> \param[out] SSMAX 68*> \verbatim 69*> SSMAX is REAL 70*> The larger singular value. 71*> \endverbatim 72* 73* Authors: 74* ======== 75* 76*> \author Univ. of Tennessee 77*> \author Univ. of California Berkeley 78*> \author Univ. of Colorado Denver 79*> \author NAG Ltd. 80* 81*> \date September 2012 82* 83*> \ingroup auxOTHERauxiliary 84* 85*> \par Further Details: 86* ===================== 87*> 88*> \verbatim 89*> 90*> Barring over/underflow, all output quantities are correct to within 91*> a few units in the last place (ulps), even in the absence of a guard 92*> digit in addition/subtraction. 93*> 94*> In IEEE arithmetic, the code works correctly if one matrix element is 95*> infinite. 96*> 97*> Overflow will not occur unless the largest singular value itself 98*> overflows, or is within a few ulps of overflow. (On machines with 99*> partial overflow, like the Cray, overflow may occur if the largest 100*> singular value is within a factor of 2 of overflow.) 101*> 102*> Underflow is harmless if underflow is gradual. Otherwise, results 103*> may correspond to a matrix modified by perturbations of size near 104*> the underflow threshold. 105*> \endverbatim 106*> 107* ===================================================================== 108 SUBROUTINE SLAS2( F, G, H, SSMIN, SSMAX ) 109* 110* -- LAPACK auxiliary routine (version 3.4.2) -- 111* -- LAPACK is a software package provided by Univ. of Tennessee, -- 112* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 113* September 2012 114* 115* .. Scalar Arguments .. 116 REAL F, G, H, SSMAX, SSMIN 117* .. 118* 119* ==================================================================== 120* 121* .. Parameters .. 122 REAL ZERO 123 PARAMETER ( ZERO = 0.0E0 ) 124 REAL ONE 125 PARAMETER ( ONE = 1.0E0 ) 126 REAL TWO 127 PARAMETER ( TWO = 2.0E0 ) 128* .. 129* .. Local Scalars .. 130 REAL AS, AT, AU, C, FA, FHMN, FHMX, GA, HA 131* .. 132* .. Intrinsic Functions .. 133 INTRINSIC ABS, MAX, MIN, SQRT 134* .. 135* .. Executable Statements .. 136* 137 FA = ABS( F ) 138 GA = ABS( G ) 139 HA = ABS( H ) 140 FHMN = MIN( FA, HA ) 141 FHMX = MAX( FA, HA ) 142 IF( FHMN.EQ.ZERO ) THEN 143 SSMIN = ZERO 144 IF( FHMX.EQ.ZERO ) THEN 145 SSMAX = GA 146 ELSE 147 SSMAX = MAX( FHMX, GA )*SQRT( ONE+ 148 $ ( MIN( FHMX, GA ) / MAX( FHMX, GA ) )**2 ) 149 END IF 150 ELSE 151 IF( GA.LT.FHMX ) THEN 152 AS = ONE + FHMN / FHMX 153 AT = ( FHMX-FHMN ) / FHMX 154 AU = ( GA / FHMX )**2 155 C = TWO / ( SQRT( AS*AS+AU )+SQRT( AT*AT+AU ) ) 156 SSMIN = FHMN*C 157 SSMAX = FHMX / C 158 ELSE 159 AU = FHMX / GA 160 IF( AU.EQ.ZERO ) THEN 161* 162* Avoid possible harmful underflow if exponent range 163* asymmetric (true SSMIN may not underflow even if 164* AU underflows) 165* 166 SSMIN = ( FHMN*FHMX ) / GA 167 SSMAX = GA 168 ELSE 169 AS = ONE + FHMN / FHMX 170 AT = ( FHMX-FHMN ) / FHMX 171 C = ONE / ( SQRT( ONE+( AS*AU )**2 )+ 172 $ SQRT( ONE+( AT*AU )**2 ) ) 173 SSMIN = ( FHMN*C )*AU 174 SSMIN = SSMIN + SSMIN 175 SSMAX = GA / ( C+C ) 176 END IF 177 END IF 178 END IF 179 RETURN 180* 181* End of SLAS2 182* 183 END 184c $Id$ 185