File: dnrm2.c

package info (click to toggle)
insighttoolkit 3.20.1%2Bgit20120521-3
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 80,652 kB
  • sloc: cpp: 458,133; ansic: 196,223; fortran: 28,000; python: 3,839; tcl: 1,811; sh: 1,184; java: 583; makefile: 430; csh: 220; perl: 193; xml: 20
file content (128 lines) | stat: -rw-r--r-- 3,794 bytes parent folder | download | duplicates (15)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/* blas/dnrm2.f -- translated by f2c (version 20050501).
   You must link the resulting object file with libf2c:
        on Microsoft Windows system, link with libf2c.lib;
        on Linux or Unix systems, link with .../path/to/libf2c.a -lm
        or, if you install libf2c.a in a standard place, with -lf2c -lm
        -- in that order, at the end of the command line, as in
                cc *.o -lf2c -lm
        Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,

                http://www.netlib.org/f2c/libf2c.zip
*/

#ifdef __cplusplus
extern "C" {
#endif
#include "v3p_netlib.h"

/*<       DOUBLE PRECISION FUNCTION DNRM2 ( N, X, INCX ) >*/
doublereal dnrm2_(integer *n, doublereal *x, integer *incx)
{
    /* System generated locals */
    integer i__1, i__2;
    doublereal ret_val, d__1;

    /* Builtin functions */
    double sqrt(doublereal);

    /* Local variables */
    integer ix;
    doublereal ssq, norm, scale, absxi;

/*     .. Scalar Arguments .. */
/*<       INTEGER                           INCX, N >*/
/*     .. Array Arguments .. */
/*<       DOUBLE PRECISION                  X( * ) >*/
/*     .. */

/*  DNRM2 returns the euclidean norm of a vector via the function */
/*  name, so that */

/*     DNRM2 := sqrt( x'*x ) */



/*  -- This version written on 25-October-1982. */
/*     Modified on 14-October-1993 to inline the call to DLASSQ. */
/*     Sven Hammarling, Nag Ltd. */


/*     .. Parameters .. */
/*<       DOUBLE PRECISION      ONE         , ZERO >*/
/*<       PARAMETER           ( ONE = 1.0D+0, ZERO = 0.0D+0 ) >*/
/*     .. Local Scalars .. */
/*<       INTEGER               IX >*/
/*<       DOUBLE PRECISION      ABSXI, NORM, SCALE, SSQ >*/
/*     .. Intrinsic Functions .. */
/*<       INTRINSIC             ABS, SQRT >*/
/*     .. */
/*     .. Executable Statements .. */
/*<       IF( N.LT.1 .OR. INCX.LT.1 )THEN >*/
    /* Parameter adjustments */
    --x;

    /* Function Body */
    if (*n < 1 || *incx < 1) {
/*<          NORM  = ZERO >*/
        norm = 0.;
/*<       ELSE IF( N.EQ.1 )THEN >*/
    } else if (*n == 1) {
/*<          NORM  = ABS( X( 1 ) ) >*/
        norm = abs(x[1]);
/*<       ELSE >*/
    } else {
/*<          SCALE = ZERO >*/
        scale = 0.;
/*<          SSQ   = ONE >*/
        ssq = 1.;
/*        The following loop is equivalent to this call to the LAPACK */
/*        auxiliary routine: */
/*        CALL DLASSQ( N, X, INCX, SCALE, SSQ ) */

/*<          DO 10, IX = 1, 1 + ( N - 1 )*INCX, INCX >*/
        i__1 = (*n - 1) * *incx + 1;
        i__2 = *incx;
        for (ix = 1; i__2 < 0 ? ix >= i__1 : ix <= i__1; ix += i__2) {
/*<             IF( X( IX ).NE.ZERO )THEN >*/
            if (x[ix] != 0.) {
/*<                ABSXI = ABS( X( IX ) ) >*/
                absxi = (d__1 = x[ix], abs(d__1));
/*<                IF( SCALE.LT.ABSXI )THEN >*/
                if (scale < absxi) {
/*<                   SSQ   = ONE   + SSQ*( SCALE/ABSXI )**2 >*/
/* Computing 2nd power */
                    d__1 = scale / absxi;
                    ssq = ssq * (d__1 * d__1) + 1.;
/*<                   SCALE = ABSXI >*/
                    scale = absxi;
/*<                ELSE >*/
                } else {
/*<                   SSQ   = SSQ   +     ( ABSXI/SCALE )**2 >*/
/* Computing 2nd power */
                    d__1 = absxi / scale;
                    ssq += d__1 * d__1;
/*<                END IF >*/
                }
/*<             END IF >*/
            }
/*<    10    CONTINUE >*/
/* L10: */
        }
/*<          NORM  = SCALE * SQRT( SSQ ) >*/
        norm = scale * sqrt(ssq);
/*<       END IF >*/
    }

/*<       DNRM2 = NORM >*/
    ret_val = norm;
/*<       RETURN >*/
    return ret_val;

/*     End of DNRM2. */

/*<       END >*/
} /* dnrm2_ */

#ifdef __cplusplus
        }
#endif