mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-04-24 17:12:34 +02:00
lavu/libm: add exp10 support
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: Hendrik Leppkes <h.leppkes@gmail.com> Reviewed-by: Michael Niedermayer <michael@niedermayer.cc> Reviewed-by: Ronald S. Bultje <rsbultje@gmail.com> Signed-off-by: Ganesh Ajjanagadde <gajjanagadde@gmail.com>
This commit is contained in:
parent
520a5d33f0
commit
e29db08cf7
2
configure
vendored
2
configure
vendored
@ -1815,6 +1815,8 @@ MATH_FUNCS="
|
|||||||
copysign
|
copysign
|
||||||
cosf
|
cosf
|
||||||
erf
|
erf
|
||||||
|
exp10
|
||||||
|
exp10f
|
||||||
exp2
|
exp2
|
||||||
exp2f
|
exp2f
|
||||||
expf
|
expf
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "attributes.h"
|
#include "attributes.h"
|
||||||
#include "intfloat.h"
|
#include "intfloat.h"
|
||||||
|
#include "mathematics.h"
|
||||||
|
|
||||||
#if HAVE_MIPSFPU && HAVE_INLINE_ASM
|
#if HAVE_MIPSFPU && HAVE_INLINE_ASM
|
||||||
#include "libavutil/mips/libm_mips.h"
|
#include "libavutil/mips/libm_mips.h"
|
||||||
@ -292,6 +293,24 @@ static inline double erf(double z)
|
|||||||
#define exp2f(x) ((float)exp2(x))
|
#define exp2f(x) ((float)exp2(x))
|
||||||
#endif /* HAVE_EXP2F */
|
#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)
|
||||||
|
{
|
||||||
|
return exp2(M_LOG2_10 * x);
|
||||||
|
}
|
||||||
|
#endif /* HAVE_EXP10 */
|
||||||
|
|
||||||
|
#if !HAVE_EXP10F
|
||||||
|
static av_always_inline float exp10f(float x)
|
||||||
|
{
|
||||||
|
return exp2f(M_LOG2_10 * x);
|
||||||
|
}
|
||||||
|
#endif /* HAVE_EXP10F */
|
||||||
|
|
||||||
#if !HAVE_ISINF
|
#if !HAVE_ISINF
|
||||||
#undef isinf
|
#undef isinf
|
||||||
/* Note: these do not follow the BSD/Apple/GNU convention of returning -1 for
|
/* Note: these do not follow the BSD/Apple/GNU convention of returning -1 for
|
||||||
|
Loading…
x
Reference in New Issue
Block a user