Re: Slaying the HYPOTamus
От | Paul Matthews |
---|---|
Тема | Re: Slaying the HYPOTamus |
Дата | |
Msg-id | 4A92922B.1040100@netspace.net.au обсуждение исходный текст |
Ответ на | Re: Slaying the HYPOTamus (Paul Matthews <plm@netspace.net.au>) |
Ответы |
Re: Slaying the HYPOTamus
|
Список | 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 по дате отправления: