diff options
author | Ganesh Ajjanagadde <gajjanagadde@gmail.com> | 2015-10-29 00:18:15 -0400 |
---|---|---|
committer | Ganesh Ajjanagadde <gajjanagadde@gmail.com> | 2015-10-30 23:18:43 -0400 |
commit | 8d9f86bd3791d4448460faee03f07751d0202c32 (patch) | |
tree | c3322bc16ea05ff9784556b17355c2a09804b8c6 /libavutil | |
parent | 865f6f410fdba92b2c92b9b83381dc96e660e4e4 (diff) | |
download | ffmpeg-8d9f86bd3791d4448460faee03f07751d0202c32.tar.gz |
avutil/rational: use frexp rather than ad-hoc log to get floating point exponent
This simplifies and cleans up the code.
Furthermore, it is much faster due to absence of the slow log computation.
Reviewed-by: Michael Niedermayer <michael@niedermayer.cc>
Signed-off-by: Ganesh Ajjanagadde <gajjanagadde@gmail.com>
Diffstat (limited to 'libavutil')
-rw-r--r-- | libavutil/rational.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/libavutil/rational.c b/libavutil/rational.c index 21d2bb72c3..81a940210c 100644 --- a/libavutil/rational.c +++ b/libavutil/rational.c @@ -106,14 +106,14 @@ AVRational av_sub_q(AVRational b, AVRational c) AVRational av_d2q(double d, int max) { AVRational a; -#define LOG2 0.69314718055994530941723212145817656807550013436025 int exponent; int64_t den; if (isnan(d)) return (AVRational) { 0,0 }; if (fabs(d) > INT_MAX + 3LL) return (AVRational) { d < 0 ? -1 : 1, 0 }; - exponent = FFMAX( (int)(log(fabs(d) + 1e-20)/LOG2), 0); + frexp(d, &exponent); + exponent = FFMAX(exponent-1, 0); den = 1LL << (61 - exponent); // (int64_t)rint() and llrint() do not work with gcc on ia64 and sparc64 av_reduce(&a.num, &a.den, floor(d * den + 0.5), den, max); |