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
45 return static_cast<float>(
static_cast<int>(
value));
47 int i =
static_cast<int>(
value);
48 return static_cast<float>(i - (
value !=
static_cast<float>(i) ? 1 : 0));
54 return static_cast<double>(
static_cast<long long>(
value));
56 long long i =
static_cast<long long>(
value);
57 return static_cast<double>(i - (
value !=
static_cast<double>(i) ? 1 : 0));
63 return static_cast<float>(
static_cast<int>(
value));
65 int i =
static_cast<int>(
value);
66 return static_cast<float>(i + (
value !=
static_cast<float>(i) ? 1 : 0));
72 return static_cast<double>(
static_cast<long long>(
value));
74 long long i =
static_cast<long long>(
value);
75 return static_cast<double>(i + (
value !=
static_cast<double>(i) ? 1 : 0));
82 return 22026.465794806718f;
84 return 0.0000453999297625f;
94 for (
int i = 1; i < 10; ++i) {
95 term *=
value /
static_cast<float>(i);
103 return 22026.465794806718;
105 return 0.0000453999297625;
115 for (
int i = 1; i < 10; ++i) {
116 term *=
value /
static_cast<double>(i);
152 if (
value <= F(0))
return F(0);
157 if (
x > F(1))
x = F(1) + (
x - F(1)) * F(0.5);
158 for (
int i = 0; i < 6; ++i) {
159 if (
x == F(0))
break;
173 return x * (F(1) - x2 * (F(1.0 / 6.0) - x2 * (F(1.0 / 120.0) - x2 * F(1.0 / 5040.0))));
180 return F(1) - x2 * (F(0.5) - x2 * (F(1.0 / 24.0) - x2 * F(1.0 / 720.0)));
185 const F kPi = F(3.14159265358979323846);
186 const F kTwoPi = F(6.28318530717958647692);
187 const F kPiHalf = F(1.57079632679489661923);
192 while (
x > kPi && guard > 0) {
x -= kTwoPi; --guard; }
195 if (
x > kPiHalf)
x = kPi -
x;
196 if (
x < -kPiHalf)
x = -kPi -
x;
204 const F kPiHalf = F(1.57079632679489661923);
215 if (
value <= F(0))
return F(-1e30);
217 while (
value >= F(2)) {
value *= F(0.5); ++e; }
222 const F u =
value - F(1);
225 const F u4 = u2 * u2;
227 const F u6 = u4 * u2;
229 F log_m = u - u2 * F(0.5) + u3 * F(1.0 / 3.0) - u4 * F(0.25)
230 + u5 * F(0.2) - u6 * F(1.0 / 6.0) + u7 * F(1.0 / 7.0);
231 const F kLn2 = F(0.69314718055994530942);
232 return log_m + F(e) * kLn2;
242 return ::sqrtf(
value);
250 return ::sqrt(
value);
258 return ::sinf(
value);
274 return ::cosf(
value);
290 return ::logf(
value);
306 return ::log10f(
value);
308 const float kInvLn10 = 0.43429448190325182765f;
315 return ::log10(
value);
317 const double kInvLn10 = 0.43429448190325182765;
324 return ::powf(base, exponent);
326 if (exponent == 0.0f)
return 1.0f;
327 int ie =
static_cast<int>(exponent);
328 if (
static_cast<float>(ie) == exponent && ie >= -8 && ie <= 8) {
330 if (ie > 0) {
for (
int i = 0; i < ie; ++i) r *= base;
return r; }
331 if (ie < 0) {
for (
int i = 0; i < -ie; ++i) r *= base;
return 1.0f / r; }
333 if (base <= 0.0f)
return 0.0f;
340 return ::pow(base, exponent);
342 if (exponent == 0.0)
return 1.0;
343 int ie =
static_cast<int>(exponent);
344 if (
static_cast<double>(ie) == exponent && ie >= -8 && ie <= 8) {
346 if (ie > 0) {
for (
int i = 0; i < ie; ++i) r *= base;
return r; }
347 if (ie < 0) {
for (
int i = 0; i < -ie; ++i) r *= base;
return 1.0 / r; }
349 if (base <= 0.0)
return 0.0;
365 return ::lroundf(
value);
367 if (
value >= 0.0f)
return static_cast<long>(
value + 0.5f);
368 return static_cast<long>(
value - 0.5f);
374 return ::lround(
value);
376 if (
value >= 0.0)
return static_cast<long>(
value + 0.5);
377 return static_cast<long>(
value - 0.5);
382#pragma push_macro("round")
386 return ::roundf(
value);
394 return ::round(
value);
399#pragma pop_macro("round")
403 return ::fmodf(
x,
y);
405 if (
y == 0.0f)
return 0.0f;
406 const float q =
x /
y;
417 if (
y == 0.0)
return 0.0;
418 const double q =
x /
y;
458 return u * (F(0.99997726) +
459 u2 * (F(-0.33262347) +
460 u2 * (F(0.19354346) +
461 u2 * (F(-0.11643287) +
462 u2 * (F(0.05265332) +
463 u2 * F(-0.01172120))))));
468 const F kPiHalf = F(1.57079632679489661923);
472 }
else if (u < F(-1)) {
480 const F kPi = F(3.14159265358979323846);
481 const F kPiHalf = F(1.57079632679489661923);
484 if (
y > F(0))
return kPiHalf;
485 if (
y < F(0))
return -kPiHalf;
490 a += (
y >= F(0)) ? kPi : -kPi;
498 return ::atan2f(
y,
x);
506 return ::atan2(
y,
x);
514 return ::hypotf(
x,
y);
522 return ::hypot(
x,
y);
530 return ::atanf(
value);
538 return ::atan(
value);
546 return ::asinf(
value);
548 const float kPiHalf = 1.57079632679489661923f;
549 if (
value >= 1.0f)
return kPiHalf;
550 if (
value <= -1.0f)
return -kPiHalf;
552 if (denom == 0.0f)
return value > 0.0f ? kPiHalf : -kPiHalf;
559 return ::asin(
value);
561 const double kPiHalf = 1.57079632679489661923;
562 if (
value >= 1.0)
return kPiHalf;
563 if (
value <= -1.0)
return -kPiHalf;
565 if (denom == 0.0)
return value > 0.0 ? kPiHalf : -kPiHalf;
572 return ::acosf(
value);
574 const float kPiHalf = 1.57079632679489661923f;
581 return ::acos(
value);
583 const double kPiHalf = 1.57079632679489661923;
590 return ::tanf(
value);
593 if (c == 0.0f)
return 0.0f;
603 if (c == 0.0)
return 0.0;
631 if (
exp > 1024)
exp = 1024;
632 while (
exp >= 30) {
value *= F(1073741824);
exp -= 30; }
638 if (neg > 1024) neg = 1024;
639 while (neg >= 30) {
value *= F(1.0 / 1073741824.0); neg -= 30; }
640 while (neg > 0) {
value *= F(0.5); --neg; }
F atan_poly_unit_(F u) FL_NOEXCEPT
F sin_reduce_(F x) FL_NOEXCEPT
F atan_full_(F u) FL_NOEXCEPT
F sin_poly_quarterturn_(F x) FL_NOEXCEPT
F atan2_full_(F y, F x) FL_NOEXCEPT
F cos_reduce_(F x) FL_NOEXCEPT
F ldexp_loop_(F value, int exp) FL_NOEXCEPT
F log_natural_(F value) FL_NOEXCEPT
F sqrt_newton_(F value) FL_NOEXCEPT
F cos_poly_quarterturn_(F x) FL_NOEXCEPT
double hypot_impl_double(double x, double y)
double atan2_impl_double(double y, double x)
float log_impl_float(float value)
float fabs_impl_float(float value)
constexpr int type_rank< T >::value
double sqrt_impl_double(double value)
double atan_impl_double(double value)
double cos_impl_double(double value)
float exp_impl_float(float value)
double pow_impl_double(double base, double exponent)
float ceil_impl_float(float value)
double tan_impl_double(double value)
double sin_impl_double(double value)
double acos_impl_double(double value)
float fmod_impl_float(float x, float y)
float log10_impl_float(float value)
double ldexp_impl_double(double value, int exp)
float atan2_impl_float(float y, float x)
double fabs_impl_double(double value)
double log_impl_double(double value)
double floor_impl_double(double value)
float acos_impl_float(float value)
double log10_impl_double(double value)
float round_impl_float(float value)
float cos_impl_float(float value)
expected< T, E > result
Alias for expected (Rust-style naming)
double round_impl_double(double value)
float pow_impl_float(float base, float exponent)
long lround_impl_float(float value)
float hypot_impl_float(float x, float y)
float sqrt_impl_float(float value)
double ceil_impl_double(double value)
float tan_impl_float(float value)
double fmod_impl_double(double x, double y)
float atan_impl_float(float value)
float sin_impl_float(float value)
float floor_impl_float(float value)
long lround_impl_double(double value)
float asin_impl_float(float value)
double asin_impl_double(double value)
enable_if< is_fixed_point< T >::value, T >::type exp(T x) FL_NOEXCEPT
double exp_impl_double(double value)
float ldexp_impl_float(float value, int exp)
Base definition for an LED controller.