This is to go with the hypot() patch I posted the other day.

As other code, such as found in adt/float.c and adt/numeric.c, simply
assumes that isnan() exists, despite it being a C99 function, I have
assumed the same.

The below code should be placed into a file called src/port/hypot.c.

Unfortunately I do not know how to drive configure and all the other
associated build magics. Could some kind soul please implemented that
portion. (Or shove me in the right direction)


#include <math.h>
#include "c.h"
#include "utils/builtins.h"

/*
 * Find the hypotenuse. Firstly x and y are swapped, if required, to make
 * x the larger number. The traditional formulae of x^2+y^2 is rearranged
 * to bring x outside the sqrt. This allows computation of the hypotenuse
 * for much larger magnitudes than otherwise normally possible.
 *
 * sqrt( x^2 + y^2 ) = sqrt( x^2( 1 + y^2/x^2) )
 *                   = x * sqrt( 1 + y^2/x^2 )
 *                   = x * sqrt( 1 + y/x * y/x )
 */
double hypot( double x, double y )
{
    double yx;

    if( isinf(x) || isinf(y) )
      return get_float8_infinity();

    if( isnan(x) || isnan(y) )
      return get_float8_nan();

    x = fabs(x);
    y = fabs(y);
    if (x < y) {
        double temp = x;
        x = y;
        y = temp;
    }
    if (x == 0.0)
        return 0.0;
    else {
        yx = y/x;
        return x*sqrt(1.0+yx*yx);
    }
}


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to