Move libm replacements to new header libm.h
[libav.git] / libavutil / libm.h
CommitLineData
335ee1aa
MR
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
56static 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
63static 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
70static 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
77static 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
84static 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 */