00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00024 #ifndef AVUTIL_LIBM_H
00025 #define AVUTIL_LIBM_H
00026
00027 #include <math.h>
00028 #include "config.h"
00029 #include "attributes.h"
00030 #include "intfloat.h"
00031
00032 #if HAVE_MIPSFPU && HAVE_INLINE_ASM
00033 #include "libavutil/mips/libm_mips.h"
00034 #endif
00035
00036 #if !HAVE_ATANF
00037 #undef atanf
00038 #define atanf(x) ((float)atan(x))
00039 #endif
00040
00041 #if !HAVE_ATAN2F
00042 #undef atan2f
00043 #define atan2f(y, x) ((float)atan2(y, x))
00044 #endif
00045
00046 #if !HAVE_POWF
00047 #undef powf
00048 #define powf(x, y) ((float)pow(x, y))
00049 #endif
00050
00051 #if !HAVE_CBRTF
00052 static av_always_inline float cbrtf(float x)
00053 {
00054 return x < 0 ? -powf(-x, 1.0 / 3.0) : powf(x, 1.0 / 3.0);
00055 }
00056 #endif
00057
00058 #if !HAVE_COSF
00059 #undef cosf
00060 #define cosf(x) ((float)cos(x))
00061 #endif
00062
00063 #if !HAVE_EXPF
00064 #undef expf
00065 #define expf(x) ((float)exp(x))
00066 #endif
00067
00068 #if !HAVE_EXP2
00069 #undef exp2
00070 #define exp2(x) exp((x) * 0.693147180559945)
00071 #endif
00072
00073 #if !HAVE_EXP2F
00074 #undef exp2f
00075 #define exp2f(x) ((float)exp2(x))
00076 #endif
00077
00078 #if !HAVE_ISINF
00079 static av_always_inline av_const int isinf(float x)
00080 {
00081 uint32_t v = av_float2int(x);
00082 if ((v & 0x7f800000) != 0x7f800000)
00083 return 0;
00084 return !(v & 0x007fffff);
00085 }
00086 #endif
00087
00088 #if !HAVE_ISNAN
00089 static av_always_inline av_const int isnan(float x)
00090 {
00091 uint32_t v = av_float2int(x);
00092 if ((v & 0x7f800000) != 0x7f800000)
00093 return 0;
00094 return v & 0x007fffff;
00095 }
00096 #endif
00097
00098 #if !HAVE_LDEXPF
00099 #undef ldexpf
00100 #define ldexpf(x, exp) ((float)ldexp(x, exp))
00101 #endif
00102
00103 #if !HAVE_LLRINT
00104 #undef llrint
00105 #define llrint(x) ((long long)rint(x))
00106 #endif
00107
00108 #if !HAVE_LLRINTF
00109 #undef llrintf
00110 #define llrintf(x) ((long long)rint(x))
00111 #endif
00112
00113 #if !HAVE_LOG2
00114 #undef log2
00115 #define log2(x) (log(x) * 1.44269504088896340736)
00116 #endif
00117
00118 #if !HAVE_LOG2F
00119 #undef log2f
00120 #define log2f(x) ((float)log2(x))
00121 #endif
00122
00123 #if !HAVE_LOG10F
00124 #undef log10f
00125 #define log10f(x) ((float)log10(x))
00126 #endif
00127
00128 #if !HAVE_SINF
00129 #undef sinf
00130 #define sinf(x) ((float)sin(x))
00131 #endif
00132
00133 #if !HAVE_RINT
00134 static inline double rint(double x)
00135 {
00136 return x >= 0 ? floor(x + 0.5) : ceil(x - 0.5);
00137 }
00138 #endif
00139
00140 #if !HAVE_LRINT
00141 static av_always_inline av_const long int lrint(double x)
00142 {
00143 return rint(x);
00144 }
00145 #endif
00146
00147 #if !HAVE_LRINTF
00148 static av_always_inline av_const long int lrintf(float x)
00149 {
00150 return (int)(rint(x));
00151 }
00152 #endif
00153
00154 #if !HAVE_ROUND
00155 static av_always_inline av_const double round(double x)
00156 {
00157 return (x > 0) ? floor(x + 0.5) : ceil(x - 0.5);
00158 }
00159 #endif
00160
00161 #if !HAVE_ROUNDF
00162 static av_always_inline av_const float roundf(float x)
00163 {
00164 return (x > 0) ? floor(x + 0.5) : ceil(x - 0.5);
00165 }
00166 #endif
00167
00168 #if !HAVE_TRUNC
00169 static av_always_inline av_const double trunc(double x)
00170 {
00171 return (x > 0) ? floor(x) : ceil(x);
00172 }
00173 #endif
00174
00175 #if !HAVE_TRUNCF
00176 static av_always_inline av_const float truncf(float x)
00177 {
00178 return (x > 0) ? floor(x) : ceil(x);
00179 }
00180 #endif
00181
00182 #endif