1      SUBROUTINE DLAS2( F, G, H, SSMIN, SSMAX )
2*
3*  -- LAPACK auxiliary routine (version 3.0) --
4*     Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
5*     Courant Institute, Argonne National Lab, and Rice University
6*     September 30, 1994
7*
8*     .. Scalar Arguments ..
9      DOUBLE PRECISION   F, G, H, SSMAX, SSMIN
10*     ..
11*
12*  Purpose
13*  =======
14*
15*  DLAS2  computes the singular values of the 2-by-2 matrix
16*     [  F   G  ]
17*     [  0   H  ].
18*  On return, SSMIN is the smaller singular value and SSMAX is the
19*  larger singular value.
20*
21*  Arguments
22*  =========
23*
24*  F       (input) DOUBLE PRECISION
25*          The (1,1) element of the 2-by-2 matrix.
26*
27*  G       (input) DOUBLE PRECISION
28*          The (1,2) element of the 2-by-2 matrix.
29*
30*  H       (input) DOUBLE PRECISION
31*          The (2,2) element of the 2-by-2 matrix.
32*
33*  SSMIN   (output) DOUBLE PRECISION
34*          The smaller singular value.
35*
36*  SSMAX   (output) DOUBLE PRECISION
37*          The larger singular value.
38*
39*  Further Details
40*  ===============
41*
42*  Barring over/underflow, all output quantities are correct to within
43*  a few units in the last place (ulps), even in the absence of a guard
44*  digit in addition/subtraction.
45*
46*  In IEEE arithmetic, the code works correctly if one matrix element is
47*  infinite.
48*
49*  Overflow will not occur unless the largest singular value itself
50*  overflows, or is within a few ulps of overflow. (On machines with
51*  partial overflow, like the Cray, overflow may occur if the largest
52*  singular value is within a factor of 2 of overflow.)
53*
54*  Underflow is harmless if underflow is gradual. Otherwise, results
55*  may correspond to a matrix modified by perturbations of size near
56*  the underflow threshold.
57*
58*  ====================================================================
59*
60*     .. Parameters ..
61      DOUBLE PRECISION   ZERO
62      PARAMETER          ( ZERO = 0.0D0 )
63      DOUBLE PRECISION   ONE
64      PARAMETER          ( ONE = 1.0D0 )
65      DOUBLE PRECISION   TWO
66      PARAMETER          ( TWO = 2.0D0 )
67*     ..
68*     .. Local Scalars ..
69      DOUBLE PRECISION   AS, AT, AU, C, FA, FHMN, FHMX, GA, HA
70*     ..
71*     .. Intrinsic Functions ..
72      INTRINSIC          ABS, MAX, MIN, SQRT
73*     ..
74*     .. Executable Statements ..
75*
76      FA = ABS( F )
77      GA = ABS( G )
78      HA = ABS( H )
79      FHMN = MIN( FA, HA )
80      FHMX = MAX( FA, HA )
81      IF( FHMN.EQ.ZERO ) THEN
82         SSMIN = ZERO
83         IF( FHMX.EQ.ZERO ) THEN
84            SSMAX = GA
85         ELSE
86            SSMAX = MAX( FHMX, GA )*SQRT( ONE+
87     $              ( MIN( FHMX, GA ) / MAX( FHMX, GA ) )**2 )
88         END IF
89      ELSE
90         IF( GA.LT.FHMX ) THEN
91            AS = ONE + FHMN / FHMX
92            AT = ( FHMX-FHMN ) / FHMX
93            AU = ( GA / FHMX )**2
94            C = TWO / ( SQRT( AS*AS+AU )+SQRT( AT*AT+AU ) )
95            SSMIN = FHMN*C
96            SSMAX = FHMX / C
97         ELSE
98            AU = FHMX / GA
99            IF( AU.EQ.ZERO ) THEN
100*
101*              Avoid possible harmful underflow if exponent range
102*              asymmetric (true SSMIN may not underflow even if
103*              AU underflows)
104*
105               SSMIN = ( FHMN*FHMX ) / GA
106               SSMAX = GA
107            ELSE
108               AS = ONE + FHMN / FHMX
109               AT = ( FHMX-FHMN ) / FHMX
110               C = ONE / ( SQRT( ONE+( AS*AU )**2 )+
111     $             SQRT( ONE+( AT*AU )**2 ) )
112               SSMIN = ( FHMN*C )*AU
113               SSMIN = SSMIN + SSMIN
114               SSMAX = GA / ( C+C )
115            END IF
116         END IF
117      END IF
118      RETURN
119*
120*     End of DLAS2
121*
122      END
123