On Tue, Dec 22, 2015 at 4:31 PM, Ganesh Ajjanagadde <gajja...@mit.edu> wrote: > On Tue, Dec 22, 2015 at 4:17 PM, Hendrik Leppkes <h.lepp...@gmail.com> wrote: >> On Wed, Dec 23, 2015 at 12:29 AM, Ganesh Ajjanagadde >> <gajjanaga...@gmail.com> wrote: >>> exp10 is a function available in GNU libm. Looks like no other common >>> libm has it. This adds support for it to FFmpeg. >>> >>> There are essentially 2 ways of handling the fallback: >>> 1. Using pow(10, x) >>> 2. Using exp2(M_LOG2_10 * x). >>> >>> First one represents a Pareto improvement, with no speed or accuracy >>> regression anywhere, but speed improvement limited to GNU libm. >>> >>> Second one represents a slight accuracy loss (relative error ~ 1e-13) >>> for non GNU libm. Speedup of > 2x is obtained on non GNU libm platforms, >>> ~30% on GNU libm. These are "average case numbers", another benefit is >>> the lack of triggering of the well-known terrible worst case paths >>> through pow. >>> >>> Based on reviews, second one chosen. Comment added accordingly. >>> >>> Reviewed-by: Michael Niedermayer <mich...@niedermayer.cc> >>> Reviewed-by: Ronald S. Bultje <rsbul...@gmail.com> >>> Signed-off-by: Ganesh Ajjanagadde <gajjanaga...@gmail.com> >>> --- >>> configure | 2 ++ >>> libavutil/libm.h | 24 ++++++++++++++++++++++++ >>> 2 files changed, 26 insertions(+) >>> >>> diff --git a/configure b/configure >>> index 54c9789..ea717a5 100755 >>> --- a/configure >>> +++ b/configure >>> @@ -1815,6 +1815,8 @@ MATH_FUNCS=" >>> copysign >>> cosf >>> erf >>> + exp10 >>> + exp10f >>> exp2 >>> exp2f >>> expf >>> diff --git a/libavutil/libm.h b/libavutil/libm.h >>> index 146768a..9705755 100644 >>> --- a/libavutil/libm.h >>> +++ b/libavutil/libm.h >>> @@ -292,6 +292,30 @@ static inline double erf(double z) >>> #define exp2f(x) ((float)exp2(x)) >>> #endif /* HAVE_EXP2F */ >>> >>> +/* Somewhat inaccurate fallbacks, relative error ~ 1e-13 concentrated on >>> very >>> +small and very large values. For perfection accuracy-wise, should use pow. >>> +Speed benefits (>2x average, with no super slow paths) deemed to be worth >>> the >>> +accuracy tradeoff */ >>> +#if !HAVE_EXP10 >>> +static av_always_inline double exp10(double x) >>> +{ >>> +#ifndef M_LOG2_10 >>> +#define M_LOG2_10 3.32192809488736234787 /* log_2 10 */ >>> +#endif >> >> Should include mathematic.h for this constant, it already defines >> common constants if not present. > > Did not know if it was safe or not. Changed locally, thanks. > > [...]
pushed _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel