LAPACK 3.11.0
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches
dlas2.f
Go to the documentation of this file.
1*> \brief \b DLAS2 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 DLAS2 + dependencies
10*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlas2.f">
11*> [TGZ]</a>
12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlas2.f">
13*> [ZIP]</a>
14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlas2.f">
15*> [TXT]</a>
16*> \endhtmlonly
17*
18* Definition:
19* ===========
20*
21* SUBROUTINE DLAS2( F, G, H, SSMIN, SSMAX )
22*
23* .. Scalar Arguments ..
24* DOUBLE PRECISION F, G, H, SSMAX, SSMIN
25* ..
26*
27*
28*> \par Purpose:
29* =============
30*>
31*> \verbatim
32*>
33*> DLAS2 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 DOUBLE PRECISION
46*> The (1,1) element of the 2-by-2 matrix.
47*> \endverbatim
48*>
49*> \param[in] G
50*> \verbatim
51*> G is DOUBLE PRECISION
52*> The (1,2) element of the 2-by-2 matrix.
53*> \endverbatim
54*>
55*> \param[in] H
56*> \verbatim
57*> H is DOUBLE PRECISION
58*> The (2,2) element of the 2-by-2 matrix.
59*> \endverbatim
60*>
61*> \param[out] SSMIN
62*> \verbatim
63*> SSMIN is DOUBLE PRECISION
64*> The smaller singular value.
65*> \endverbatim
66*>
67*> \param[out] SSMAX
68*> \verbatim
69*> SSMAX is DOUBLE PRECISION
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*> \ingroup OTHERauxiliary
82*
83*> \par Further Details:
84* =====================
85*>
86*> \verbatim
87*>
88*> Barring over/underflow, all output quantities are correct to within
89*> a few units in the last place (ulps), even in the absence of a guard
90*> digit in addition/subtraction.
91*>
92*> In IEEE arithmetic, the code works correctly if one matrix element is
93*> infinite.
94*>
95*> Overflow will not occur unless the largest singular value itself
96*> overflows, or is within a few ulps of overflow. (On machines with
97*> partial overflow, like the Cray, overflow may occur if the largest
98*> singular value is within a factor of 2 of overflow.)
99*>
100*> Underflow is harmless if underflow is gradual. Otherwise, results
101*> may correspond to a matrix modified by perturbations of size near
102*> the underflow threshold.
103*> \endverbatim
104*>
105* =====================================================================
106 SUBROUTINE dlas2( F, G, H, SSMIN, SSMAX )
107*
108* -- LAPACK auxiliary routine --
109* -- LAPACK is a software package provided by Univ. of Tennessee, --
110* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
111*
112* .. Scalar Arguments ..
113 DOUBLE PRECISION F, G, H, SSMAX, SSMIN
114* ..
115*
116* ====================================================================
117*
118* .. Parameters ..
119 DOUBLE PRECISION ZERO
120 parameter( zero = 0.0d0 )
121 DOUBLE PRECISION ONE
122 parameter( one = 1.0d0 )
123 DOUBLE PRECISION TWO
124 parameter( two = 2.0d0 )
125* ..
126* .. Local Scalars ..
127 DOUBLE PRECISION AS, AT, AU, C, FA, FHMN, FHMX, GA, HA
128* ..
129* .. Intrinsic Functions ..
130 INTRINSIC abs, max, min, sqrt
131* ..
132* .. Executable Statements ..
133*
134 fa = abs( f )
135 ga = abs( g )
136 ha = abs( h )
137 fhmn = min( fa, ha )
138 fhmx = max( fa, ha )
139 IF( fhmn.EQ.zero ) THEN
140 ssmin = zero
141 IF( fhmx.EQ.zero ) THEN
142 ssmax = ga
143 ELSE
144 ssmax = max( fhmx, ga )*sqrt( one+
145 $ ( min( fhmx, ga ) / max( fhmx, ga ) )**2 )
146 END IF
147 ELSE
148 IF( ga.LT.fhmx ) THEN
149 as = one + fhmn / fhmx
150 at = ( fhmx-fhmn ) / fhmx
151 au = ( ga / fhmx )**2
152 c = two / ( sqrt( as*as+au )+sqrt( at*at+au ) )
153 ssmin = fhmn*c
154 ssmax = fhmx / c
155 ELSE
156 au = fhmx / ga
157 IF( au.EQ.zero ) THEN
158*
159* Avoid possible harmful underflow if exponent range
160* asymmetric (true SSMIN may not underflow even if
161* AU underflows)
162*
163 ssmin = ( fhmn*fhmx ) / ga
164 ssmax = ga
165 ELSE
166 as = one + fhmn / fhmx
167 at = ( fhmx-fhmn ) / fhmx
168 c = one / ( sqrt( one+( as*au )**2 )+
169 $ sqrt( one+( at*au )**2 ) )
170 ssmin = ( fhmn*c )*au
171 ssmin = ssmin + ssmin
172 ssmax = ga / ( c+c )
173 END IF
174 END IF
175 END IF
176 RETURN
177*
178* End of DLAS2
179*
180 END
subroutine dlas2(F, G, H, SSMIN, SSMAX)
DLAS2 computes singular values of a 2-by-2 triangular matrix.
Definition: dlas2.f:107