root / src / lapack / double / dlas2.f @ 10
Historique | Voir | Annoter | Télécharger (3,55 ko)
1 |
SUBROUTINE DLAS2( F, G, H, SSMIN, SSMAX ) |
---|---|
2 |
* |
3 |
* -- LAPACK auxiliary routine (version 3.2) -- |
4 |
* -- LAPACK is a software package provided by Univ. of Tennessee, -- |
5 |
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- |
6 |
* November 2006 |
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 |