The R Project SVN R

Rev

Rev 5288 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

/* finds dsqrt(a**2+b**2) without overflow or destructive underflow */

#ifdef HAVE_CONFIG_H
#include <Rconfig.h>
#endif

#include "Mathlib.h"/*fmax2 ..*/
#include "Applic.h"

double pythag(double a, double b)
{
    double p, r, s, t, tmp, u;

    p = fmax2(fabs(a), fabs(b));
    if (p != 0.0) {

    /* r = (fmin(fabs(a), fabs(b))/p)**2 */

    tmp = fmin2(fabs(a), fabs(b))/p;
    r = tmp * tmp;
    for(;;) {
        t = 4.0 + r;
        if (t == 4.0)
        break;
        s = r / t;
        u = 1.0 + 2.0 * s;
        p = u * p;

        /* r = (s / u)**2 * r */

        tmp = (s / u);
        r = tmp * tmp * r;
    }
    }
    return p;
}