15#ifndef FL_MATH_USE_LIBM
16# if SKETCH_HAS_LARGE_MEMORY
17# define FL_MATH_USE_LIBM 1
19# define FL_MATH_USE_LIBM 0
46 return static_cast<float>(
static_cast<int>(
value));
48 int i =
static_cast<int>(
value);
49 return static_cast<float>(i - (
value !=
static_cast<float>(i) ? 1 : 0));
55 return static_cast<double>(
static_cast<long long>(
value));
57 long long i =
static_cast<long long>(
value);
58 return static_cast<double>(i - (
value !=
static_cast<double>(i) ? 1 : 0));
64 return static_cast<float>(
static_cast<int>(
value));
66 int i =
static_cast<int>(
value);
67 return static_cast<float>(i + (
value !=
static_cast<float>(i) ? 1 : 0));
73 return static_cast<double>(
static_cast<long long>(
value));
75 long long i =
static_cast<long long>(
value);
76 return static_cast<double>(i + (
value !=
static_cast<double>(i) ? 1 : 0));
111 fa.
u =
static_cast<u32
>(a + 127) << 23;
112 fb.
u =
static_cast<u32
>(b + 127) << 23;
113 return (p * fa.
f) * fb.
f;
120 fa.
u =
static_cast<u64>(a + 1023) << 52;
121 fb.
u =
static_cast<u64>(b + 1023) << 52;
122 return (p * fa.
f) * fb.
f;
128 const u32 ax = xb.
u & 0x7fffffffu;
129 if (ax >= 0x42b17218u) {
130 if (ax > 0x7f800000u)
return x;
131 if ((xb.
u >> 31) == 0u) {
136 if (ax >= 0x42cff1b5u)
return 0.0f;
140 const float kMagic = 12582912.0f;
142 t.f =
x * 1.44269504088896341f + kMagic;
143 const int k =
t.i - 0x4b400000;
144 const float kf =
t.f - kMagic;
145 const float r = (
x - kf * 6.9314575195e-01f) - kf * 1.4286067653e-06f;
147 float p = 1.393364297e-03f;
148 p = p * r + 8.363175565e-03f;
149 p = p * r + 4.166646498e-02f;
150 p = p * r + 1.666657700e-01f;
151 p = p * r + 5.000000013e-01f;
152 p = (p * r * r) + r + 1.0f;
159 if (
sizeof(
double) ==
sizeof(
float)) {
160 return static_cast<double>(
exp_reduced_(
static_cast<float>(
x)));
164 const u64 ax = xb.
u & 0x7fffffffffffffffull;
165 if (ax >= 0x40862e42fefa39efull) {
166 if (ax > 0x7ff0000000000000ull)
return x;
167 if ((xb.
u >> 63) == 0u) {
169 inf.
u = 0x7ff0000000000000ull;
172 if (ax >= 0x40874910d52d3052ull)
return 0.0;
174 const double kMagic = 6755399441055744.0;
176 t.f =
x * 1.44269504088896338700e+00 + kMagic;
177 const int k =
static_cast<int>(
t.i - 0x4338000000000000ll);
178 const double kd =
t.f - kMagic;
183 const double hi =
x - kd * 6.93147180369123816490e-01;
184 const double lo = kd * 1.90821492927058770002e-10;
185 const double r = hi - lo;
186 const double r2 = r * r;
187 const double c = r - r2 * (1.66666666666666019037e-01 +
188 r2 * (-2.77777777770155933842e-03 +
189 r2 * (6.61375632143793436117e-05 +
190 r2 * (-1.65339022054652515390e-06 +
191 r2 * 4.13813679705723846039e-08))));
192 const double p = 1.0 - ((lo - (r * c) / (2.0 - c)) - hi);
234 if (
value <= F(0))
return F(0);
239 if (
x > F(1))
x = F(1) + (
x - F(1)) * F(0.5);
240 for (
int i = 0; i < 6; ++i) {
241 if (
x == F(0))
break;
255 return x * (F(1) - x2 * (F(1.0 / 6.0) - x2 * (F(1.0 / 120.0) - x2 * F(1.0 / 5040.0))));
262 return F(1) - x2 * (F(0.5) - x2 * (F(1.0 / 24.0) - x2 * F(1.0 / 720.0)));
267 const F kPi = F(3.14159265358979323846);
268 const F kTwoPi = F(6.28318530717958647692);
269 const F kPiHalf = F(1.57079632679489661923);
274 while (
x > kPi && guard > 0) {
x -= kTwoPi; --guard; }
277 if (
x > kPiHalf)
x = kPi -
x;
278 if (
x < -kPiHalf)
x = -kPi -
x;
286 const F kPiHalf = F(1.57079632679489661923);
297 if (
value <= F(0))
return F(-1e30);
299 while (
value >= F(2)) {
value *= F(0.5); ++e; }
304 const F u =
value - F(1);
307 const F u4 = u2 * u2;
309 const F u6 = u4 * u2;
311 F log_m = u - u2 * F(0.5) + u3 * F(1.0 / 3.0) - u4 * F(0.25)
312 + u5 * F(0.2) - u6 * F(1.0 / 6.0) + u7 * F(1.0 / 7.0);
313 const F kLn2 = F(0.69314718055994530942);
314 return log_m + F(e) * kLn2;
324 return ::sqrtf(
value);
332 return ::sqrt(
value);
340 return ::sinf(
value);
356 return ::cosf(
value);
372 return ::logf(
value);
388 return ::log10f(
value);
390 const float kInvLn10 = 0.43429448190325182765f;
397 return ::log10(
value);
399 const double kInvLn10 = 0.43429448190325182765;
406 return ::powf(base, exponent);
408 if (exponent == 0.0f)
return 1.0f;
409 int ie =
static_cast<int>(exponent);
410 if (
static_cast<float>(ie) == exponent && ie >= -8 && ie <= 8) {
412 if (ie > 0) {
for (
int i = 0; i < ie; ++i) r *= base;
return r; }
413 if (ie < 0) {
for (
int i = 0; i < -ie; ++i) r *= base;
return 1.0f / r; }
415 if (base <= 0.0f)
return 0.0f;
422 return ::pow(base, exponent);
424 if (exponent == 0.0)
return 1.0;
425 int ie =
static_cast<int>(exponent);
426 if (
static_cast<double>(ie) == exponent && ie >= -8 && ie <= 8) {
428 if (ie > 0) {
for (
int i = 0; i < ie; ++i) r *= base;
return r; }
429 if (ie < 0) {
for (
int i = 0; i < -ie; ++i) r *= base;
return 1.0 / r; }
431 if (base <= 0.0)
return 0.0;
447 return ::lroundf(
value);
449 if (
value >= 0.0f)
return static_cast<long>(
value + 0.5f);
450 return static_cast<long>(
value - 0.5f);
456 return ::lround(
value);
458 if (
value >= 0.0)
return static_cast<long>(
value + 0.5);
459 return static_cast<long>(
value - 0.5);
464#pragma push_macro("round")
468 return ::roundf(
value);
476 return ::round(
value);
481#pragma pop_macro("round")
485 return ::fmodf(
x,
y);
487 if (
y == 0.0f)
return 0.0f;
488 const float q =
x /
y;
499 if (
y == 0.0)
return 0.0;
500 const double q =
x /
y;
540 return u * (F(0.99997726) +
541 u2 * (F(-0.33262347) +
542 u2 * (F(0.19354346) +
543 u2 * (F(-0.11643287) +
544 u2 * (F(0.05265332) +
545 u2 * F(-0.01172120))))));
550 const F kPiHalf = F(1.57079632679489661923);
554 }
else if (u < F(-1)) {
562 const F kPi = F(3.14159265358979323846);
563 const F kPiHalf = F(1.57079632679489661923);
566 if (
y > F(0))
return kPiHalf;
567 if (
y < F(0))
return -kPiHalf;
572 a += (
y >= F(0)) ? kPi : -kPi;
580 return ::atan2f(
y,
x);
588 return ::atan2(
y,
x);
596 return ::hypotf(
x,
y);
604 return ::hypot(
x,
y);
612 return ::atanf(
value);
620 return ::atan(
value);
628 return ::asinf(
value);
630 const float kPiHalf = 1.57079632679489661923f;
631 if (
value >= 1.0f)
return kPiHalf;
632 if (
value <= -1.0f)
return -kPiHalf;
634 if (denom == 0.0f)
return value > 0.0f ? kPiHalf : -kPiHalf;
641 return ::asin(
value);
643 const double kPiHalf = 1.57079632679489661923;
644 if (
value >= 1.0)
return kPiHalf;
645 if (
value <= -1.0)
return -kPiHalf;
647 if (denom == 0.0)
return value > 0.0 ? kPiHalf : -kPiHalf;
654 return ::acosf(
value);
656 const float kPiHalf = 1.57079632679489661923f;
663 return ::acos(
value);
665 const double kPiHalf = 1.57079632679489661923;
672 return ::tanf(
value);
675 if (c == 0.0f)
return 0.0f;
685 if (c == 0.0)
return 0.0;
713 if (
exp > 1024)
exp = 1024;
714 while (
exp >= 30) {
value *= F(1073741824);
exp -= 30; }
720 if (neg > 1024) neg = 1024;
721 while (neg >= 30) {
value *= F(1.0 / 1073741824.0); neg -= 30; }
722 while (neg > 0) {
value *= F(0.5); --neg; }
F atan_poly_unit_(F u) FL_NO_EXCEPT
F sin_reduce_(F x) FL_NO_EXCEPT
F cos_poly_quarterturn_(F x) FL_NO_EXCEPT
float scale_pow2_(float p, int k) FL_NO_EXCEPT
F atan2_full_(F y, F x) FL_NO_EXCEPT
F sin_poly_quarterturn_(F x) FL_NO_EXCEPT
F cos_reduce_(F x) FL_NO_EXCEPT
F log_natural_(F value) FL_NO_EXCEPT
F sqrt_newton_(F value) FL_NO_EXCEPT
float exp_reduced_(float x) FL_NO_EXCEPT
F atan_full_(F u) FL_NO_EXCEPT
F ldexp_loop_(F value, int exp) FL_NO_EXCEPT
double ceil_impl_double(double value) FL_NO_EXCEPT
double fabs_impl_double(double value) FL_NO_EXCEPT
u8 u8 fract8 blur_amount FL_NO_EXCEPT
constexpr int type_rank< T >::value
long lround_impl_float(float value) FL_NO_EXCEPT
double ldexp_impl_double(double value, int exp) FL_NO_EXCEPT
double tan_impl_double(double value) FL_NO_EXCEPT
double sin_impl_double(double value) FL_NO_EXCEPT
float sqrt_impl_float(float value) FL_NO_EXCEPT
double fmod_impl_double(double x, double y) FL_NO_EXCEPT
float exp_impl_float(float value) FL_NO_EXCEPT
float floor_impl_float(float value) FL_NO_EXCEPT
double sqrt_impl_double(double value) FL_NO_EXCEPT
double floor_impl_double(double value) FL_NO_EXCEPT
double pow_impl_double(double base, double exponent) FL_NO_EXCEPT
double acos_impl_double(double value) FL_NO_EXCEPT
long lround_impl_double(double value) FL_NO_EXCEPT
float atan_impl_float(float value) FL_NO_EXCEPT
float sin_impl_float(float value) FL_NO_EXCEPT
float acos_impl_float(float value) FL_NO_EXCEPT
float pow_impl_float(float base, float exponent) FL_NO_EXCEPT
float hypot_impl_float(float x, float y) FL_NO_EXCEPT
float ceil_impl_float(float value) FL_NO_EXCEPT
double asin_impl_double(double value) FL_NO_EXCEPT
double atan_impl_double(double value) FL_NO_EXCEPT
double cos_impl_double(double value) FL_NO_EXCEPT
float round_impl_float(float value) FL_NO_EXCEPT
float log_impl_float(float value) FL_NO_EXCEPT
float log10_impl_float(float value) FL_NO_EXCEPT
enable_if< is_fixed_point< T >::value, T >::type exp(T x) FL_NO_EXCEPT
double round_impl_double(double value) FL_NO_EXCEPT
double log_impl_double(double value) FL_NO_EXCEPT
float ldexp_impl_float(float value, int exp) FL_NO_EXCEPT
double atan2_impl_double(double y, double x) FL_NO_EXCEPT
double hypot_impl_double(double x, double y) FL_NO_EXCEPT
float tan_impl_float(float value) FL_NO_EXCEPT
float asin_impl_float(float value) FL_NO_EXCEPT
double exp_impl_double(double value) FL_NO_EXCEPT
double log10_impl_double(double value) FL_NO_EXCEPT
float fabs_impl_float(float value) FL_NO_EXCEPT
float cos_impl_float(float value) FL_NO_EXCEPT
float atan2_impl_float(float y, float x) FL_NO_EXCEPT
float fmod_impl_float(float x, float y) FL_NO_EXCEPT
Base definition for an LED controller.