*> \brief \b DLAE2 computes the eigenvalues of a 2-by-2 symmetric matrix. * * =========== DOCUMENTATION =========== * * Online html documentation available at * http://www.netlib.org/lapack/explore-html/ * *> \htmlonly *> Download DLAE2 + dependencies *> *> [TGZ] *> *> [ZIP] *> *> [TXT] *> \endhtmlonly * * Definition: * =========== * * SUBROUTINE DLAE2( A, B, C, RT1, RT2 ) * * .. Scalar Arguments .. * DOUBLE PRECISION A, B, C, RT1, RT2 * .. * * *> \par Purpose: * ============= *> *> \verbatim *> *> DLAE2 computes the eigenvalues of a 2-by-2 symmetric matrix *> [ A B ] *> [ B C ]. *> On return, RT1 is the eigenvalue of larger absolute value, and RT2 *> is the eigenvalue of smaller absolute value. *> \endverbatim * * Arguments: * ========== * *> \param[in] A *> \verbatim *> A is DOUBLE PRECISION *> The (1,1) element of the 2-by-2 matrix. *> \endverbatim *> *> \param[in] B *> \verbatim *> B is DOUBLE PRECISION *> The (1,2) and (2,1) elements of the 2-by-2 matrix. *> \endverbatim *> *> \param[in] C *> \verbatim *> C is DOUBLE PRECISION *> The (2,2) element of the 2-by-2 matrix. *> \endverbatim *> *> \param[out] RT1 *> \verbatim *> RT1 is DOUBLE PRECISION *> The eigenvalue of larger absolute value. *> \endverbatim *> *> \param[out] RT2 *> \verbatim *> RT2 is DOUBLE PRECISION *> The eigenvalue of smaller absolute value. *> \endverbatim * * Authors: * ======== * *> \author Univ. of Tennessee *> \author Univ. of California Berkeley *> \author Univ. of Colorado Denver *> \author NAG Ltd. * *> \date September 2012 * *> \ingroup auxOTHERauxiliary * *> \par Further Details: * ===================== *> *> \verbatim *> *> RT1 is accurate to a few ulps barring over/underflow. *> *> RT2 may be inaccurate if there is massive cancellation in the *> determinant A*C-B*B; higher precision or correctly rounded or *> correctly truncated arithmetic would be needed to compute RT2 *> accurately in all cases. *> *> Overflow is possible only if RT1 is within a factor of 5 of overflow. *> Underflow is harmless if the input data is 0 or exceeds *> underflow_threshold / macheps. *> \endverbatim *> * ===================================================================== SUBROUTINE GAL_DLAE2(A,B,C,RT1,RT2) * * -- LAPACK auxiliary routine (version 3.4.2) -- * -- LAPACK is a software package provided by Univ. of Tennessee, -- * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- * September 2012 * * .. Scalar Arguments .. DOUBLE PRECISION A,B,C,RT1,RT2 * .. * * ===================================================================== * * .. Parameters .. DOUBLE PRECISION ONE PARAMETER (ONE=1.0D0) DOUBLE PRECISION TWO PARAMETER (TWO=2.0D0) DOUBLE PRECISION ZERO PARAMETER (ZERO=0.0D0) DOUBLE PRECISION HALF PARAMETER (HALF=0.5D0) * .. * .. Local Scalars .. DOUBLE PRECISION AB,ACMN,ACMX,ADF,DF,RT,SM,TB * .. * .. Intrinsic Functions .. INTRINSIC ABS,SQRT * .. * .. Executable Statements .. * * Compute the eigenvalues * SM=A+C DF=A-C ADF=ABS(DF) TB=B+B AB=ABS(TB) IF(ABS(A).GT.ABS(C))THEN ACMX=A ACMN=C ELSE ACMX=C ACMN=A END IF IF(ADF.GT.AB)THEN RT=ADF*SQRT(ONE+(AB/ADF)**2) ELSE IF(ADF.LT.AB)THEN RT=AB*SQRT(ONE+(ADF/AB)**2) ELSE * * Includes case AB=ADF=0 * RT=AB*SQRT(TWO) END IF IF(SM.LT.ZERO)THEN RT1=HALF*(SM-RT) * * Order of execution important. * To get fully accurate smaller eigenvalue, * next line needs to be executed in higher precision. * RT2=(ACMX/RT1)*ACMN-(B/RT1)*B ELSE IF(SM.GT.ZERO)THEN RT1=HALF*(SM+RT) * * Order of execution important. * To get fully accurate smaller eigenvalue, * next line needs to be executed in higher precision. * RT2=(ACMX/RT1)*ACMN-(B/RT1)*B ELSE * * Includes case RT1 = RT2 = 0 * RT1=HALF*RT RT2=-HALF*RT END IF RETURN * * End of DLAE2 * END