LAPACK  3.9.1
LAPACK: Linear Algebra PACKage
dlassq.f
Go to the documentation of this file.
1 *> \brief \b DLASSQ updates a sum of squares represented in scaled form.
2 *
3 * =========== DOCUMENTATION ===========
4 *
5 * Online html documentation available at
6 * http://www.netlib.org/lapack/explore-html/
7 *
8 *> \htmlonly
9 *> Download DLASSQ + dependencies
10 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlassq.f">
11 *> [TGZ]</a>
12 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlassq.f">
13 *> [ZIP]</a>
14 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlassq.f">
15 *> [TXT]</a>
16 *> \endhtmlonly
17 *
18 * Definition:
19 * ===========
20 *
21 * SUBROUTINE DLASSQ( N, X, INCX, SCALE, SUMSQ )
22 *
23 * .. Scalar Arguments ..
24 * INTEGER INCX, N
25 * DOUBLE PRECISION SCALE, SUMSQ
26 * ..
27 * .. Array Arguments ..
28 * DOUBLE PRECISION X( * )
29 * ..
30 *
31 *
32 *> \par Purpose:
33 * =============
34 *>
35 *> \verbatim
36 *>
37 *> DLASSQ returns the values scl and smsq such that
38 *>
39 *> ( scl**2 )*smsq = x( 1 )**2 +...+ x( n )**2 + ( scale**2 )*sumsq,
40 *>
41 *> where x( i ) = X( 1 + ( i - 1 )*INCX ). The value of sumsq is
42 *> assumed to be non-negative and scl returns the value
43 *>
44 *> scl = max( scale, abs( x( i ) ) ).
45 *>
46 *> scale and sumsq must be supplied in SCALE and SUMSQ and
47 *> scl and smsq are overwritten on SCALE and SUMSQ respectively.
48 *>
49 *> The routine makes only one pass through the vector x.
50 *> \endverbatim
51 *
52 * Arguments:
53 * ==========
54 *
55 *> \param[in] N
56 *> \verbatim
57 *> N is INTEGER
58 *> The number of elements to be used from the vector X.
59 *> \endverbatim
60 *>
61 *> \param[in] X
62 *> \verbatim
63 *> X is DOUBLE PRECISION array, dimension (1+(N-1)*INCX)
64 *> The vector for which a scaled sum of squares is computed.
65 *> x( i ) = X( 1 + ( i - 1 )*INCX ), 1 <= i <= n.
66 *> \endverbatim
67 *>
68 *> \param[in] INCX
69 *> \verbatim
70 *> INCX is INTEGER
71 *> The increment between successive values of the vector X.
72 *> INCX > 0.
73 *> \endverbatim
74 *>
75 *> \param[in,out] SCALE
76 *> \verbatim
77 *> SCALE is DOUBLE PRECISION
78 *> On entry, the value scale in the equation above.
79 *> On exit, SCALE is overwritten with scl , the scaling factor
80 *> for the sum of squares.
81 *> \endverbatim
82 *>
83 *> \param[in,out] SUMSQ
84 *> \verbatim
85 *> SUMSQ is DOUBLE PRECISION
86 *> On entry, the value sumsq in the equation above.
87 *> On exit, SUMSQ is overwritten with smsq , the basic sum of
88 *> squares from which scl has been factored out.
89 *> \endverbatim
90 *
91 * Authors:
92 * ========
93 *
94 *> \author Univ. of Tennessee
95 *> \author Univ. of California Berkeley
96 *> \author Univ. of Colorado Denver
97 *> \author NAG Ltd.
98 *
99 *> \ingroup OTHERauxiliary
100 *
101 * =====================================================================
102  SUBROUTINE dlassq( N, X, INCX, SCALE, SUMSQ )
103 *
104 * -- LAPACK auxiliary routine --
105 * -- LAPACK is a software package provided by Univ. of Tennessee, --
106 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
107 *
108 * .. Scalar Arguments ..
109  INTEGER INCX, N
110  DOUBLE PRECISION SCALE, SUMSQ
111 * ..
112 * .. Array Arguments ..
113  DOUBLE PRECISION X( * )
114 * ..
115 *
116 * =====================================================================
117 *
118 * .. Parameters ..
119  DOUBLE PRECISION ZERO
120  parameter( zero = 0.0d+0 )
121 * ..
122 * .. Local Scalars ..
123  INTEGER IX
124  DOUBLE PRECISION ABSXI
125 * ..
126 * .. External Functions ..
127  LOGICAL DISNAN
128  EXTERNAL disnan
129 * ..
130 * .. Intrinsic Functions ..
131  INTRINSIC abs
132 * ..
133 * .. Executable Statements ..
134 *
135  IF( n.GT.0 ) THEN
136  DO 10 ix = 1, 1 + ( n-1 )*incx, incx
137  absxi = abs( x( ix ) )
138  IF( absxi.GT.zero.OR.disnan( absxi ) ) THEN
139  IF( scale.LT.absxi ) THEN
140  sumsq = 1 + sumsq*( scale / absxi )**2
141  scale = absxi
142  ELSE
143  sumsq = sumsq + ( absxi / scale )**2
144  END IF
145  END IF
146  10 CONTINUE
147  END IF
148  RETURN
149 *
150 * End of DLASSQ
151 *
152  END
subroutine dlassq(N, X, INCX, SCALE, SUMSQ)
DLASSQ updates a sum of squares represented in scaled form.
Definition: dlassq.f:103