double ddot( n, dx, incx, dy, incy )
double *dx, *dy;
int n, incx, incy;
/*
Purpose : Inner product dx . dy
--- Input ---
n : number of elements in input vector(s)
dx : double vector with n+1 elements, dx[0] is not used
incx : storage spacing between elements of dx
dy : double vector with n+1 elements, dy[0] is not used
incy : storage spacing between elements of dy
--- Output ---
ddot : dot product dx . dy, 0 if n <= 0
ddot = sum for i = 0 to n-1 of
dx[lx+i*incx] * dy[ly+i*incy] where lx = 1 if
incx >= 0, else lx = (-incx)*(n-1)+1, and ly
is defined in a similar way using incy.
*/
{
double dotprod;
int ix, iy, i, m;
dotprod = 0.;
if ( n <= 0 )
return dotprod;
/* Code for unequal or nonpositive increments. */
if ( incx != incy || incx < 1 ) {
ix = 1;
iy = 1;
if ( incx < 0 )
ix = ( -n + 1 ) * incx + 1;
if ( incy < 0 )
iy = ( -n + 1 ) * incy + 1;
for ( i = 1 ; i <= n ; i++ ) {
dotprod = dotprod + dx[ix] * dy[iy];
ix = ix + incx;
iy = iy + incy;
}
return dotprod;
}
/* Code for both increments equal to 1. */
/* Clean-up loop so remaining vector length is a multiple of 5. */
if ( incx == 1 ) {
m = n % 5;
if ( m != 0 ) {
for ( i = 1 ; i <= m ; i++ )
dotprod = dotprod + dx[i] * dy[i];
if ( n < 5 )
return dotprod;
}
for ( i = m + 1 ; i <= n ; i = i + 5 )
dotprod = dotprod + dx[i] * dy[i] + dx[i+1] * dy[i+1] +
dx[i+2] * dy[i+2] + dx[i+3] * dy[i+3] +
dx[i+4] * dy[i+4];
return dotprod;
}
/* Code for positive equal nonunit increments. */
for ( i = 1 ; i <= n * incx ; i = i + incx )
dotprod = dotprod + dx[i] * dy[i];
return dotprod;
}
|