1*> \brief \b DLAE2 computes the eigenvalues of a 2-by-2 symmetric matrix.
2*
3*  =========== DOCUMENTATION ===========
4*
5* Online html documentation available at
6*            http://www.netlib.org/lapack/explore-html/
7*
8*> \htmlonly
9*> Download DLAE2 + dependencies
10*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlae2.f">
11*> [TGZ]</a>
12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlae2.f">
13*> [ZIP]</a>
14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlae2.f">
15*> [TXT]</a>
16*> \endhtmlonly
17*
18*  Definition:
19*  ===========
20*
21*       SUBROUTINE DLAE2( A, B, C, RT1, RT2 )
22*
23*       .. Scalar Arguments ..
24*       DOUBLE PRECISION   A, B, C, RT1, RT2
25*       ..
26*
27*
28*> \par Purpose:
29*  =============
30*>
31*> \verbatim
32*>
33*> DLAE2  computes the eigenvalues of a 2-by-2 symmetric matrix
34*>    [  A   B  ]
35*>    [  B   C  ].
36*> On return, RT1 is the eigenvalue of larger absolute value, and RT2
37*> is the eigenvalue of smaller absolute value.
38*> \endverbatim
39*
40*  Arguments:
41*  ==========
42*
43*> \param[in] A
44*> \verbatim
45*>          A is DOUBLE PRECISION
46*>          The (1,1) element of the 2-by-2 matrix.
47*> \endverbatim
48*>
49*> \param[in] B
50*> \verbatim
51*>          B is DOUBLE PRECISION
52*>          The (1,2) and (2,1) elements of the 2-by-2 matrix.
53*> \endverbatim
54*>
55*> \param[in] C
56*> \verbatim
57*>          C is DOUBLE PRECISION
58*>          The (2,2) element of the 2-by-2 matrix.
59*> \endverbatim
60*>
61*> \param[out] RT1
62*> \verbatim
63*>          RT1 is DOUBLE PRECISION
64*>          The eigenvalue of larger absolute value.
65*> \endverbatim
66*>
67*> \param[out] RT2
68*> \verbatim
69*>          RT2 is DOUBLE PRECISION
70*>          The eigenvalue of smaller absolute 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*>  RT1 is accurate to a few ulps barring over/underflow.
91*>
92*>  RT2 may be inaccurate if there is massive cancellation in the
93*>  determinant A*C-B*B; higher precision or correctly rounded or
94*>  correctly truncated arithmetic would be needed to compute RT2
95*>  accurately in all cases.
96*>
97*>  Overflow is possible only if RT1 is within a factor of 5 of overflow.
98*>  Underflow is harmless if the input data is 0 or exceeds
99*>     underflow_threshold / macheps.
100*> \endverbatim
101*>
102*  =====================================================================
103      SUBROUTINE GAL_DLAE2(A,B,C,RT1,RT2)
104*
105*  -- LAPACK auxiliary routine (version 3.4.2) --
106*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
107*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
108*     September 2012
109*
110*     .. Scalar Arguments ..
111      DOUBLE PRECISION A,B,C,RT1,RT2
112*     ..
113*
114* =====================================================================
115*
116*     .. Parameters ..
117      DOUBLE PRECISION ONE
118      PARAMETER (ONE=1.0D0)
119      DOUBLE PRECISION TWO
120      PARAMETER (TWO=2.0D0)
121      DOUBLE PRECISION ZERO
122      PARAMETER (ZERO=0.0D0)
123      DOUBLE PRECISION HALF
124      PARAMETER (HALF=0.5D0)
125*     ..
126*     .. Local Scalars ..
127      DOUBLE PRECISION AB,ACMN,ACMX,ADF,DF,RT,SM,TB
128*     ..
129*     .. Intrinsic Functions ..
130      INTRINSIC ABS,SQRT
131*     ..
132*     .. Executable Statements ..
133*
134*     Compute the eigenvalues
135*
136      SM=A+C
137      DF=A-C
138      ADF=ABS(DF)
139      TB=B+B
140      AB=ABS(TB)
141      IF(ABS(A).GT.ABS(C))THEN
142      ACMX=A
143      ACMN=C
144      ELSE
145      ACMX=C
146      ACMN=A
147      END IF
148      IF(ADF.GT.AB)THEN
149      RT=ADF*SQRT(ONE+(AB/ADF)**2)
150      ELSE IF(ADF.LT.AB)THEN
151      RT=AB*SQRT(ONE+(ADF/AB)**2)
152      ELSE
153*
154*        Includes case AB=ADF=0
155*
156      RT=AB*SQRT(TWO)
157      END IF
158      IF(SM.LT.ZERO)THEN
159      RT1=HALF*(SM-RT)
160*
161*        Order of execution important.
162*        To get fully accurate smaller eigenvalue,
163*        next line needs to be executed in higher precision.
164*
165      RT2=(ACMX/RT1)*ACMN-(B/RT1)*B
166      ELSE IF(SM.GT.ZERO)THEN
167      RT1=HALF*(SM+RT)
168*
169*        Order of execution important.
170*        To get fully accurate smaller eigenvalue,
171*        next line needs to be executed in higher precision.
172*
173      RT2=(ACMX/RT1)*ACMN-(B/RT1)*B
174      ELSE
175*
176*        Includes case RT1 = RT2 = 0
177*
178      RT1=HALF*RT
179      RT2=-HALF*RT
180      END IF
181      RETURN
182*
183*     End of DLAE2
184*
185      END
186