summaryrefslogtreecommitdiff
path: root/libavutil/rational.c
diff options
context:
space:
mode:
authorGanesh Ajjanagadde <gajjanagadde@gmail.com>2015-10-29 00:18:15 -0400
committerGanesh Ajjanagadde <gajjanagadde@gmail.com>2015-10-30 23:18:43 -0400
commit8d9f86bd3791d4448460faee03f07751d0202c32 (patch)
treec3322bc16ea05ff9784556b17355c2a09804b8c6 /libavutil/rational.c
parent865f6f410fdba92b2c92b9b83381dc96e660e4e4 (diff)
downloadffmpeg-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/rational.c')
-rw-r--r--libavutil/rational.c4
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);