On Sun, Nov 15, 2015 at 10:03:37AM -0500, Ganesh Ajjanagadde wrote: > It is known that the naive sqrt(x*x + y*y) approach for computing the > hypotenuse suffers from overflow and accuracy issues, see e.g > http://www.johndcook.com/blog/2010/06/02/whats-so-hard-about-finding-a-hypotenuse/. > This adds hypot support to FFmpeg, a C99 function. > > On platforms without hypot, this patch does a reaonable workaround, that > although not as accurate as GNU libm, is readable and does not suffer > from the overflow issue. Improvements can be made separately. > > Signed-off-by: Ganesh Ajjanagadde <gajjanaga...@gmail.com> > --- > configure | 2 ++ > libavutil/libm.h | 23 +++++++++++++++++++++++ > 2 files changed, 25 insertions(+) > > diff --git a/configure b/configure > index d518b21..45df724 100755 > --- a/configure > +++ b/configure > @@ -1774,6 +1774,7 @@ MATH_FUNCS=" > exp2 > exp2f > expf > + hypot > isinf > isnan > ldexpf > @@ -5309,6 +5310,7 @@ disabled crystalhd || check_lib > libcrystalhd/libcrystalhd_if.h DtsCrystalHDVersi > > atan2f_args=2 > copysign_args=2 > +hypot_args=2 > ldexpf_args=2 > powf_args=2 > > diff --git a/libavutil/libm.h b/libavutil/libm.h > index 6c17b28..f7a2b41 100644 > --- a/libavutil/libm.h > +++ b/libavutil/libm.h > @@ -102,6 +102,29 @@ static av_always_inline av_const int isnan(float x) > } > #endif /* HAVE_ISNAN */ > > +#if !HAVE_HYPOT > +#undef hypot > +static inline av_const double hypot(double x, double y) > +{ > + double ret, temp; > + x = fabs(x); > + y = fabs(y); > + > + if (isinf(x) || isinf(y)) > + return av_int2double(0x7ff0000000000000);
if either is NaN the result should be NaN i think return x+y might achive this [...] -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB He who knows, does not speak. He who speaks, does not know. -- Lao Tsu
signature.asc
Description: Digital signature
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel