Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

/*
 * hypot -- sqrt(p*p+q*q), but overflows only if the result does.
 * See Cleve Moler and Donald Morrison,
 * ``Replacing Square Roots by Pythagorean Sums,''
 * IBM Journal of Research and Development,
 * Vol. 27, Number 6, pp. 577-581, Nov. 1983
 */

#include <u.h>
#include <libc.h>

double
hypot(double p, double q)
{
        double r, s, pfac;

        if(p < 0)
                p = -p;
        if(q < 0)
                q = -q;
        if(p < q) {
                r = p;
                p = q;
                q = r;
        }
        if(p == 0)
                return 0;
        pfac = p;
        r = q = q/p;
        p = 1;
        for(;;) {
                r *= r;
                s = r+4;
                if(s == 4)
                        return p*pfac;
                r /= s;
                p += 2*r*p;
                q *= r;
                r = q/p;
        }
}