Move libm replacements to new header libm.h
[libav.git] / libavutil / libm.h
1 /*
2 * This file is part of FFmpeg.
3 *
4 * FFmpeg is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * FFmpeg is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with FFmpeg; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19 /**
20 * @file libavutil/libm.h
21 * Replacements for frequently missing libm functions
22 */
23
24 #ifndef AVUTIL_LIBM_H
25 #define AVUTIL_LIBM_H
26
27 #include <math.h>
28 #include "config.h"
29
30 #if !HAVE_EXP2
31 #undef exp2
32 #define exp2(x) exp((x) * 0.693147180559945)
33 #endif /* HAVE_EXP2 */
34
35 #if !HAVE_EXP2F
36 #undef exp2f
37 #define exp2f(x) ((float)exp2(x))
38 #endif /* HAVE_EXP2F */
39
40 #if !HAVE_LLRINT
41 #undef llrint
42 #define llrint(x) ((long long)rint(x))
43 #endif /* HAVE_LLRINT */
44
45 #if !HAVE_LOG2
46 #undef log2
47 #define log2(x) (log(x) * 1.44269504088896340736)
48 #endif /* HAVE_LOG2 */
49
50 #if !HAVE_LOG2F
51 #undef log2f
52 #define log2f(x) ((float)log2(x))
53 #endif /* HAVE_LOG2F */
54
55 #if !HAVE_LRINT
56 static av_always_inline av_const long int lrint(double x)
57 {
58 return rint(x);
59 }
60 #endif /* HAVE_LRINT */
61
62 #if !HAVE_LRINTF
63 static av_always_inline av_const long int lrintf(float x)
64 {
65 return (int)(rint(x));
66 }
67 #endif /* HAVE_LRINTF */
68
69 #if !HAVE_ROUND
70 static av_always_inline av_const double round(double x)
71 {
72 return (x > 0) ? floor(x + 0.5) : ceil(x - 0.5);
73 }
74 #endif /* HAVE_ROUND */
75
76 #if !HAVE_ROUNDF
77 static av_always_inline av_const float roundf(float x)
78 {
79 return (x > 0) ? floor(x + 0.5) : ceil(x - 0.5);
80 }
81 #endif /* HAVE_ROUNDF */
82
83 #if !HAVE_TRUNCF
84 static av_always_inline av_const float truncf(float x)
85 {
86 return (x > 0) ? floor(x) : ceil(x);
87 }
88 #endif /* HAVE_TRUNCF */
89
90 #endif /* AVUTIL_LIBM_H */