[FFmpeg-devel] [PATCH 2/3] lavu/internal: add avpriv_exp10

James Almer jamrial at gmail.com
Fri Dec 25 18:26:14 CET 2015


On 12/25/2015 2:11 PM, Ganesh Ajjanagadde wrote:
> Fast, reasonably accurate 10^x. Alternative of detection of libm exp10 at configure
> time is not worth the trouble, since it is anyway not POSIX or ISO C,
> and currently only the GNU libm has it. Furthermore, GNU libm's variant
> is ~ 2x slower, and is ironically not correctly rounded (2 ulp off) to justify all
> that slowdown.
> 
> Reviewed-by: Michael Niedermayer <michael at niedermayer.cc>
> Signed-off-by: Ganesh Ajjanagadde <gajjanagadde at gmail.com>
> ---
>  libavutil/internal.h | 19 +++++++++++++++++++
>  1 file changed, 19 insertions(+)
> 
> diff --git a/libavutil/internal.h b/libavutil/internal.h
> index f86b7fb..ae11601 100644
> --- a/libavutil/internal.h
> +++ b/libavutil/internal.h
> @@ -292,6 +292,25 @@ static av_always_inline av_const int64_t ff_rint64_clip(double a, int64_t amin,
>      return res;
>  }
>  
> +/**
> + * Compute 10^x for floating point values. Note: this function is by no means
> + * "correctly rounded", and is meant as a fast, reasonably accurate approximation.
> + * For instance, maximum relative error for the double precision variant is
> + * ~ 1e-13 for very small and very large values.
> + * This is ~2x faster than GNU libm's approach, which is still off by 2ulp on
> + * some inputs.
> + * @param x exponent
> + * @return 10^x
> + */
> +static av_always_inline double avpriv_exp10(double x)

It's an inline function in a header, and internal at that. Just call it ff_exp10.

> +{
> +    return exp2(M_LOG2_10 * x);
> +}
> +
> +static av_always_inline float avpriv_exp10f(float x)
> +{
> +    return exp2f(M_LOG2_10 * x);
> +}
>  
>  /**
>   * A wrapper for open() setting O_CLOEXEC.
> 



More information about the ffmpeg-devel mailing list