root / src / blas / dznrm2.f @ 7
Historique | Voir | Annoter | Télécharger (1,82 ko)
1 |
DOUBLE PRECISION FUNCTION DZNRM2(N,X,INCX) |
---|---|
2 |
* .. Scalar Arguments .. |
3 |
INTEGER INCX,N |
4 |
* .. |
5 |
* .. Array Arguments .. |
6 |
DOUBLE COMPLEX X(*) |
7 |
* .. |
8 |
* |
9 |
* Purpose |
10 |
* ======= |
11 |
* |
12 |
* DZNRM2 returns the euclidean norm of a vector via the function |
13 |
* name, so that |
14 |
* |
15 |
* DZNRM2 := sqrt( conjg( x' )*x ) |
16 |
* |
17 |
* |
18 |
* -- This version written on 25-October-1982. |
19 |
* Modified on 14-October-1993 to inline the call to ZLASSQ. |
20 |
* Sven Hammarling, Nag Ltd. |
21 |
* |
22 |
* |
23 |
* .. Parameters .. |
24 |
DOUBLE PRECISION ONE,ZERO |
25 |
PARAMETER (ONE=1.0D+0,ZERO=0.0D+0) |
26 |
* .. |
27 |
* .. Local Scalars .. |
28 |
DOUBLE PRECISION NORM,SCALE,SSQ,TEMP |
29 |
INTEGER IX |
30 |
* .. |
31 |
* .. Intrinsic Functions .. |
32 |
INTRINSIC ABS,DBLE,DIMAG,SQRT |
33 |
* .. |
34 |
IF (N.LT.1 .OR. INCX.LT.1) THEN |
35 |
NORM = ZERO |
36 |
ELSE |
37 |
SCALE = ZERO |
38 |
SSQ = ONE |
39 |
* The following loop is equivalent to this call to the LAPACK |
40 |
* auxiliary routine: |
41 |
* CALL ZLASSQ( N, X, INCX, SCALE, SSQ ) |
42 |
* |
43 |
DO 10 IX = 1,1 + (N-1)*INCX,INCX |
44 |
IF (DBLE(X(IX)).NE.ZERO) THEN |
45 |
TEMP = ABS(DBLE(X(IX))) |
46 |
IF (SCALE.LT.TEMP) THEN |
47 |
SSQ = ONE + SSQ* (SCALE/TEMP)**2 |
48 |
SCALE = TEMP |
49 |
ELSE |
50 |
SSQ = SSQ + (TEMP/SCALE)**2 |
51 |
END IF |
52 |
END IF |
53 |
IF (DIMAG(X(IX)).NE.ZERO) THEN |
54 |
TEMP = ABS(DIMAG(X(IX))) |
55 |
IF (SCALE.LT.TEMP) THEN |
56 |
SSQ = ONE + SSQ* (SCALE/TEMP)**2 |
57 |
SCALE = TEMP |
58 |
ELSE |
59 |
SSQ = SSQ + (TEMP/SCALE)**2 |
60 |
END IF |
61 |
END IF |
62 |
10 CONTINUE |
63 |
NORM = SCALE*SQRT(SSQ) |
64 |
END IF |
65 |
* |
66 |
DZNRM2 = NORM |
67 |
RETURN |
68 |
* |
69 |
* End of DZNRM2. |
70 |
* |
71 |
END |