Re: Slaying the HYPOTamus - Mailing list pgsql-hackers

From Paul Matthews
Subject Re: Slaying the HYPOTamus
Date
Msg-id 4A92922B.1040100@netspace.net.au
Whole thread Raw
In response to Re: Slaying the HYPOTamus  (Paul Matthews <plm@netspace.net.au>)
Responses Re: Slaying the HYPOTamus  (David Fetter <david@fetter.org>)
List 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
formulaeof x^2+y^2 is rearranged* to bring x outside the sqrt. This allows computation of the hypotenuse* for much
largermagnitudes 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);   }
 
}



pgsql-hackers by date:

Previous
From: Magnus Hagander
Date:
Subject: Re: hba load error and silent mode
Next
From: Peter Eisentraut
Date:
Subject: Re: clang's static checker report.