From: | Paul Matthews <plm(at)netspace(dot)net(dot)au> |
---|---|
To: | pgsql-hackers(at)postgresql(dot)org |
Subject: | Re: Slaying the HYPOTamus |
Date: | 2009-08-24 13:14:19 |
Message-ID: | 4A92922B.1040100@netspace.net.au |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
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);
}
}
From | Date | Subject | |
---|---|---|---|
Next Message | Peter Eisentraut | 2009-08-24 13:40:47 | Re: clang's static checker report. |
Previous Message | Magnus Hagander | 2009-08-24 12:57:02 | Re: hba load error and silent mode |