⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 slas2.c

📁 DTMK软件开发包,此为开源软件,是一款很好的医学图像开发资源.
💻 C
字号:
/* lapack/single/slas2.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"

/*<       SUBROUTINE SLAS2( F, G, H, SSMIN, SSMAX ) >*/
/* Subroutine */ int slas2_(real *f, real *g, real *h__, real *ssmin, real *
        ssmax)
{
    /* System generated locals */
    real r__1, r__2;

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

    /* Local variables */
    real c__, fa, ga, ha, as, at, au, fhmn, fhmx;


/*  -- 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 */

/*     .. Scalar Arguments .. */
/*<       REAL               F, G, H, SSMAX, SSMIN >*/
/*     .. */

/*  Purpose */
/*  ======= */

/*  SLAS2  computes the singular values of the 2-by-2 matrix */
/*     [  F   G  ] */
/*     [  0   H  ]. */
/*  On return, SSMIN is the smaller singular value and SSMAX is the */
/*  larger singular value. */

/*  Arguments */
/*  ========= */

/*  F       (input) REAL */
/*          The (1,1) element of the 2-by-2 matrix. */

/*  G       (input) REAL */
/*          The (1,2) element of the 2-by-2 matrix. */

/*  H       (input) REAL */
/*          The (2,2) element of the 2-by-2 matrix. */

/*  SSMIN   (output) REAL */
/*          The smaller singular value. */

/*  SSMAX   (output) REAL */
/*          The larger singular value. */

/*  Further Details */
/*  =============== */

/*  Barring over/underflow, all output quantities are correct to within */
/*  a few units in the last place (ulps), even in the absence of a guard */
/*  digit in addition/subtraction. */

/*  In IEEE arithmetic, the code works correctly if one matrix element is */
/*  infinite. */

/*  Overflow will not occur unless the largest singular value itself */
/*  overflows, or is within a few ulps of overflow. (On machines with */
/*  partial overflow, like the Cray, overflow may occur if the largest */
/*  singular value is within a factor of 2 of overflow.) */

/*  Underflow is harmless if underflow is gradual. Otherwise, results */
/*  may correspond to a matrix modified by perturbations of size near */
/*  the underflow threshold. */

/*  ==================================================================== */

/*     .. Parameters .. */
/*<       REAL               ZERO >*/
/*<       PARAMETER          ( ZERO = 0.0E0 ) >*/
/*<       REAL               ONE >*/
/*<       PARAMETER          ( ONE = 1.0E0 ) >*/
/*<       REAL               TWO >*/
/*<       PARAMETER          ( TWO = 2.0E0 ) >*/
/*     .. */
/*     .. Local Scalars .. */
/*<       REAL               AS, AT, AU, C, FA, FHMN, FHMX, GA, HA >*/
/*     .. */
/*     .. Intrinsic Functions .. */
/*<       INTRINSIC          ABS, MAX, MIN, SQRT >*/
/*     .. */
/*     .. Executable Statements .. */

/*<       FA = ABS( F ) >*/
    fa = dabs(*f);
/*<       GA = ABS( G ) >*/
    ga = dabs(*g);
/*<       HA = ABS( H ) >*/
    ha = dabs(*h__);
/*<       FHMN = MIN( FA, HA ) >*/
    fhmn = dmin(fa,ha);
/*<       FHMX = MAX( FA, HA ) >*/
    fhmx = dmax(fa,ha);
/*<       IF( FHMN.EQ.ZERO ) THEN >*/
    if (fhmn == (float)0.) {
/*<          SSMIN = ZERO >*/
        *ssmin = (float)0.;
/*<          IF( FHMX.EQ.ZERO ) THEN >*/
        if (fhmx == (float)0.) {
/*<             SSMAX = GA >*/
            *ssmax = ga;
/*<          ELSE >*/
        } else {
/*<    >*/
/* Computing 2nd power */
            r__1 = dmin(fhmx,ga) / dmax(fhmx,ga);
            *ssmax = dmax(fhmx,ga) * sqrt(r__1 * r__1 + (float)1.);
/*<          END IF >*/
        }
/*<       ELSE >*/
    } else {
/*<          IF( GA.LT.FHMX ) THEN >*/
        if (ga < fhmx) {
/*<             AS = ONE + FHMN / FHMX >*/
            as = fhmn / fhmx + (float)1.;
/*<             AT = ( FHMX-FHMN ) / FHMX >*/
            at = (fhmx - fhmn) / fhmx;
/*<             AU = ( GA / FHMX )**2 >*/
/* Computing 2nd power */
            r__1 = ga / fhmx;
            au = r__1 * r__1;
/*<             C = TWO / ( SQRT( AS*AS+AU )+SQRT( AT*AT+AU ) ) >*/
            c__ = (float)2. / (sqrt(as * as + au) + sqrt(at * at + au));
/*<             SSMIN = FHMN*C >*/
            *ssmin = fhmn * c__;
/*<             SSMAX = FHMX / C >*/
            *ssmax = fhmx / c__;
/*<          ELSE >*/
        } else {
/*<             AU = FHMX / GA >*/
            au = fhmx / ga;
/*<             IF( AU.EQ.ZERO ) THEN >*/
            if (au == (float)0.) {

/*              Avoid possible harmful underflow if exponent range */
/*              asymmetric (true SSMIN may not underflow even if */
/*              AU underflows) */

/*<                SSMIN = ( FHMN*FHMX ) / GA >*/
                *ssmin = fhmn * fhmx / ga;
/*<                SSMAX = GA >*/
                *ssmax = ga;
/*<             ELSE >*/
            } else {
/*<                AS = ONE + FHMN / FHMX >*/
                as = fhmn / fhmx + (float)1.;
/*<                AT = ( FHMX-FHMN ) / FHMX >*/
                at = (fhmx - fhmn) / fhmx;
/*<    >*/
/* Computing 2nd power */
                r__1 = as * au;
/* Computing 2nd power */
                r__2 = at * au;
                c__ = (float)1. / (sqrt(r__1 * r__1 + (float)1.) + sqrt(r__2 *
                         r__2 + (float)1.));
/*<                SSMIN = ( FHMN*C )*AU >*/
                *ssmin = fhmn * c__ * au;
/*<                SSMIN = SSMIN + SSMIN >*/
                *ssmin += *ssmin;
/*<                SSMAX = GA / ( C+C ) >*/
                *ssmax = ga / (c__ + c__);
/*<             END IF >*/
            }
/*<          END IF >*/
        }
/*<       END IF >*/
    }
/*<       RETURN >*/
    return 0;

/*     End of SLAS2 */

/*<       END >*/
} /* slas2_ */

#ifdef __cplusplus
        }
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -