drscl.c
来自「InsightToolkit-1.4.0(有大量的优化算法程序)」· C语言 代码 · 共 96 行
C
96 行
#include "f2c.h"
#include "netlib.h"
/* Subroutine */ void drscl_(n, sa, sx, incx)
integer *n;
doublereal *sa, *sx;
integer *incx;
{
static doublereal cden;
static logical done;
static doublereal cnum, cden1, cnum1;
static doublereal bignum, smlnum, mul;
/* -- LAPACK auxiliary routine (version 3.0) -- */
/* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., */
/* Courant Institute, Argonne National Lab, and Rice University */
/* September 30, 1994 */
/* Purpose */
/* ======= */
/* */
/* DRSCL multiplies an n-element real vector x by the real scalar 1/a. */
/* This is done without overflow or underflow as long as */
/* the final result x/a does not overflow or underflow. */
/* */
/* Arguments */
/* ========= */
/* */
/* N (input) INTEGER */
/* The number of components of the vector x. */
/* */
/* SA (input) DOUBLE PRECISION */
/* The scalar a which is used to divide each component of x. */
/* SA must be >= 0, or the subroutine will divide by zero. */
/* */
/* SX (input/output) DOUBLE PRECISION array, dimension */
/* (1+(N-1)*abs(INCX)) */
/* The n-element vector x. */
/* */
/* INCX (input) INTEGER */
/* The increment between successive values of the vector SX. */
/* > 0: SX(1) = X(1) and SX(1+(i-1)*INCX) = x(i), 1< i<= n */
/* */
/* ===================================================================== */
/* Quick return if possible */
if (*n <= 0) {
return;
}
/* Get machine parameters */
smlnum = dlamch_("S");
bignum = 1. / smlnum;
dlabad_(&smlnum, &bignum);
/* Initialize the denominator to SA and the numerator to 1. */
cden = *sa;
cnum = 1.;
L10:
cden1 = cden * smlnum;
cnum1 = cnum / bignum;
if (abs(cden1) > abs(cnum) && cnum != 0.) {
/* Pre-multiply X by SMLNUM if CDEN is large compared to CNUM. */
mul = smlnum;
done = FALSE_;
cden = cden1;
} else if (abs(cnum1) > abs(cden)) {
/* Pre-multiply X by BIGNUM if CDEN is small compared to CNUM. */
mul = bignum;
done = FALSE_;
cnum = cnum1;
} else {
/* Multiply X by CNUM / CDEN and return. */
mul = cnum / cden;
done = TRUE_;
}
/* Scale the vector X by MUL */
dscal_(n, &mul, sx, incx);
if (! done) {
goto L10;
}
} /* drscl_ */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?