21 #ifndef AVUTIL_SOFTFLOAT_H
22 #define AVUTIL_SOFTFLOAT_H
53 if(v.
exp > 0)
return (
double)v.
mant * (double)(1 << v.
exp);
54 else return (
double)v.
mant / (double)(1 << (-v.
exp));
60 while((a.
mant + 0x1FFFFFFFU)<0x3FFFFFFFU){
89 int t= a.
mant + 0x40000000 < 0;
92 int t= (a.
mant + 0x3FFFFFFF
U)>>31;
133 if (t <-31)
return - b.
mant ;
134 else if (t < 0)
return (a.
mant >> (-t)) - b.
mant ;
135 else if (t < 32)
return a.
mant - (b.
mant >> t);
146 if (t <-31)
return 0 > b.
mant ;
147 else if (t < 0)
return (a.
mant >> (-t)) > b.
mant ;
148 else if (t < 32)
return a.
mant > (b.
mant >> t);
149 else return a.
mant > 0 ;
157 if (t <-31)
return b;
204 else if (val.
mant < 0)
208 tabIndex = (val.
mant - 0x20000000) >> 20;
210 rem = val.
mant & 0xFFFFF;
217 if (val.
mant < 0x40000000)
222 val.
exp = (val.
exp >> 1) + 1;
238 sign = (idx << 27) >> 31;
240 cv = (cv ^ sign) - sign;
243 sign = (idx << 27) >> 31;
245 sv = (sv ^ sign) - sign;
251 idx = (int)(((int64_t)cv * ct - (int64_t)sv * st + 0x20000000) >> 30);
253 sv = (int)(((int64_t)cv * st + (int64_t)sv * ct + 0x20000000) >> 30);
261 idx = (int)(((int64_t)cv * ct - (int64_t)sv * st + 0x20000000) >> 30);
263 sv = (int)(((int64_t)cv * st + (int64_t)sv * ct + 0x20000000) >> 30);
268 ct = (int)(((int64_t)
av_costbl_4_sf[idx & 0x1f] * (0x800 - (a & 0x7ff)) +
271 st = (int)(((int64_t)
av_sintbl_4_sf[idx & 0x1f] * (0x800 - (a & 0x7ff)) +
275 *c = (int)(((int64_t)cv * ct + (int64_t)sv * st + 0x20000000) >> 30);
277 *s = (int)(((int64_t)cv * st + (int64_t)sv * ct + 0x20000000) >> 30);
static av_always_inline SoftFloat av_sqrt_sf(SoftFloat val)
Rounding-to-nearest used.
const char const char void * val
static const int32_t av_costbl_4_sf[33]
static const SoftFloat FLOAT_05
0.5
static av_const SoftFloat av_div_sf(SoftFloat a, SoftFloat b)
b has to be normalized and not zero.
static const int32_t av_sintbl_3_sf[32]
static const SoftFloat FLOAT_0
0.0
static av_const double av_sf2double(SoftFloat v)
Convert a SoftFloat to a double precision float.
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
static const SoftFloat FLOAT_100000
100000
static av_const SoftFloat av_normalize_sf(SoftFloat a)
static const SoftFloat FLOAT_1
1.0
static const SoftFloat FLOAT_0999999
0.999999
simple assert() macros that are a bit more flexible than ISO C assert().
static av_unused void av_sincos_sf(int a, int *s, int *c)
Rounding-to-nearest used.
static av_const int av_cmp_sf(SoftFloat a, SoftFloat b)
Compares two SoftFloats.
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
static av_const int av_gt_sf(SoftFloat a, SoftFloat b)
Compares two SoftFloats.
static av_const SoftFloat av_normalize1_sf(SoftFloat a)
static const int32_t av_sqrttbl_sf[512+1]
static av_const int av_sf2int(SoftFloat v, int frac_bits)
Converts a SoftFloat to an integer.
static const int32_t av_costbl_2_sf[32]
static const int32_t av_costbl_1_sf[16]
static const int32_t av_sintbl_2_sf[32]
static av_const SoftFloat av_sub_sf(SoftFloat a, SoftFloat b)
static av_const SoftFloat av_add_sf(SoftFloat a, SoftFloat b)
static const int32_t av_sqr_exp_multbl_sf[2]
common internal and external API header
static const SoftFloat FLOAT_1584893192
1.584893192 (10^.2)
static av_const SoftFloat av_mul_sf(SoftFloat a, SoftFloat b)
static const SoftFloat FLOAT_EPSILON
A small value.
static const int32_t av_sintbl_4_sf[33]
static const int32_t av_costbl_3_sf[32]
static av_const SoftFloat av_int2sf(int v, int frac_bits)
Converts a mantisse and exponent to a SoftFloat.