FastLED 3.9.15
Loading...
Searching...
No Matches
math.h
Go to the documentation of this file.
1#pragma once
2
3// Centralized math functions for FastLED.
4//
5// All math lives here: basic ops (min/max/abs/clamp), transcendentals
6// (sin/cos/exp/log/pow/sqrt), rounding, angle conversion, and constants.
7//
8// Type dispatch:
9// float — explicit f-suffix overloads (sinf, cosf, etc.)
10// double — explicit non-template overloads (sin, cos, etc.)
11// integral — template promotes to float, returns float
12// fixed-point — overloads in fl/math/fixed_point.h (SFINAE-guarded)
13//
14// Backward-compatible headers fl/math_macros.h and fl/clamp.h still exist
15// and forward here.
16
18#include "fl/stl/int.h"
19#include "fl/stl/type_traits.h"
20#include "fl/stl/undef.h" // IWYU pragma: keep
21#include "fl/stl/noexcept.h"
22
23// ===== Constants =============================================================
24
25#ifndef FL_PI
26#define FL_PI 3.1415926535897932384626433832795
27#endif
28
29#ifndef FL_E
30#define FL_E 2.71828182845904523536
31#endif
32
33#ifndef FL_M_PI
34#define FL_M_PI FL_PI
35#endif
36
37#ifndef FL_EPSILON_F
38#define FL_EPSILON_F 1.19209290e-07F
39#endif
40
41#ifndef FL_EPSILON_D
42#define FL_EPSILON_D 2.2204460492503131e-16
43#endif
44
45#ifndef FL_INFINITY_FLOAT
46#define FL_INFINITY_FLOAT (1.0f / 0.0f)
47#endif
48
49#ifndef FL_INFINITY_DOUBLE
50#define FL_INFINITY_DOUBLE (1.0 / 0.0)
51#endif
52
53#ifndef FL_FLT_MAX
54#define FL_FLT_MAX 3.402823466e+38F
55#endif
56
57namespace fl {
58
59// ===== Basic: min, max, abs, clamp ===========================================
60
61template <typename T> constexpr inline T abs(T value) FL_NOEXCEPT {
62 return value < 0 ? -value : value;
63}
64
70
71template <typename T, typename U> constexpr inline common_type_t<T, U> min(T a, U b) FL_NOEXCEPT {
72 return (a < b) ? a : b;
73}
74
75template <typename T, typename U> constexpr inline common_type_t<T, U> max(T a, U b) FL_NOEXCEPT {
76 return (a > b) ? a : b;
77}
78
80
81template <typename T> FASTLED_FORCE_INLINE T clamp(T value, T lo, T hi) FL_NOEXCEPT {
82 if (value < lo) return lo;
83 if (value > hi) return hi;
84 return value;
85}
86
87// ===== Approximate equality ===================================================
88
89template <typename T, typename U>
90constexpr inline bool almost_equal(T a, T b, U tolerance) FL_NOEXCEPT {
91 return fl::abs(a - b) < tolerance;
92}
93
94inline bool almost_equal(float a, float b) FL_NOEXCEPT {
95 return fl::abs(a - b) < FL_EPSILON_F;
96}
97
98inline bool almost_equal(double a, double b) FL_NOEXCEPT {
99 return fl::abs(a - b) < FL_EPSILON_F;
100}
101
102// ===== Legacy macros (prefer fl:: functions directly) ========================
103
104#ifndef FL_MAX
105#define FL_MAX(a, b) fl::max(a, b)
106#endif
107
108#ifndef FL_MIN
109#define FL_MIN(a, b) fl::min(a, b)
110#endif
111
112#ifndef FL_ABS
113#define FL_ABS(x) fl::abs(x)
114#endif
115
116#ifndef FL_ALMOST_EQUAL
117#define FL_ALMOST_EQUAL(a, b, small) fl::almost_equal(a, b, small)
118#endif
119
120#ifndef FL_ALMOST_EQUAL_FLOAT
121#define FL_ALMOST_EQUAL_FLOAT(a, b) fl::almost_equal(static_cast<float>(a), static_cast<float>(b))
122#endif
123
124#ifndef FL_ALMOST_EQUAL_EPSILON
125#define FL_ALMOST_EQUAL_EPSILON(a, b, epsilon) fl::almost_equal(a, b, epsilon)
126#endif
127
128#ifndef FL_ALMOST_EQUAL_DOUBLE
129#define FL_ALMOST_EQUAL_DOUBLE(a, b) fl::almost_equal(static_cast<double>(a), static_cast<double>(b))
130#endif
131
132// ===== Map range =============================================================
133
136FL_DISABLE_WARNING(double-promotion)
141
142namespace map_range_detail {
143
144// Primary template for map_range_math
145template <typename T, typename U> struct map_range_math {
146 static U map(T value, T in_min, T in_max, U out_min, U out_max) FL_NOEXCEPT {
147 if (in_min == in_max)
148 return out_min;
149 return out_min +
150 (value - in_min) * (out_max - out_min) / (in_max - in_min);
151 }
152};
153
154// Specialization for u8 -> u8
155template <> struct map_range_math<u8, u8> {
156 static u8 map(u8 value, u8 in_min, u8 in_max,
157 u8 out_min, u8 out_max) FL_NOEXCEPT;
158};
159
160// Specialization for u16 -> u16
161template <> struct map_range_math<u16, u16> {
162 static u16 map(u16 value, u16 in_min, u16 in_max,
163 u16 out_min, u16 out_max) FL_NOEXCEPT;
164};
165
166// Equality comparison helpers
167template <typename T> bool equals(T a, T b) FL_NOEXCEPT { return a == b; }
168inline bool equals(float a, float b) FL_NOEXCEPT { return fl::almost_equal(a, b); }
169inline bool equals(double d, double d2) FL_NOEXCEPT { return fl::almost_equal(d, d2); }
170
171} // namespace map_range_detail
172
173template <typename T, typename U>
174FASTLED_FORCE_INLINE U map_range(T value, T in_min, T in_max, U out_min,
175 U out_max) FL_NOEXCEPT {
176 if (map_range_detail::equals(value, in_min)) {
177 return out_min;
178 }
179 if (map_range_detail::equals(value, in_max)) {
180 return out_max;
181 }
182 return map_range_detail::map_range_math<T, U>::map(value, in_min, in_max, out_min, out_max);
183}
184
185template <typename T, typename U>
186FASTLED_FORCE_INLINE U map_range_clamped(T value, T in_min, T in_max, U out_min,
187 U out_max) FL_NOEXCEPT {
188 value = clamp(value, in_min, in_max);
189 return map_range<T, U>(value, in_min, in_max, out_min, out_max);
190}
191
192namespace map_range_detail {
193
194inline u8 map_range_math<u8, u8>::map(u8 value, u8 in_min, u8 in_max,
195 u8 out_min, u8 out_max) FL_NOEXCEPT {
196 if (value == in_min) {
197 return out_min;
198 }
199 if (value == in_max) {
200 return out_max;
201 }
202 i16 v16 = value;
203 i16 in_min16 = in_min;
204 i16 in_max16 = in_max;
205 i16 out_min16 = out_min;
206 i16 out_max16 = out_max;
207 i16 out16 = fl::map_range<i16, i16>(v16, in_min16, in_max16,
208 out_min16, out_max16);
209 if (out16 < 0) {
210 out16 = 0;
211 } else if (out16 > 255) {
212 out16 = 255;
213 }
214 return static_cast<u8>(out16);
215}
216
217inline u16 map_range_math<u16, u16>::map(u16 value, u16 in_min, u16 in_max,
218 u16 out_min, u16 out_max) FL_NOEXCEPT {
219 if (value == in_min) {
220 return out_min;
221 }
222 if (value == in_max) {
223 return out_max;
224 }
225 u32 v32 = value;
226 u32 in_min32 = in_min;
227 u32 in_max32 = in_max;
228 u32 out_min32 = out_min;
229 u32 out_max32 = out_max;
230 u32 out32 = fl::map_range<u32, u32>(v32, in_min32, in_max32,
231 out_min32, out_max32);
232 if (out32 > 65535) {
233 out32 = 65535;
234 }
235 return static_cast<u16>(out32);
236}
237
238} // namespace map_range_detail
239
241
242// ===== Forward declarations (implementations in math.cpp.hpp) ================
243
245double floor_impl_double(double value) FL_NOEXCEPT;
247double ceil_impl_double(double value) FL_NOEXCEPT;
248float exp_impl_float(float value) FL_NOEXCEPT;
249double exp_impl_double(double value) FL_NOEXCEPT;
251double sqrt_impl_double(double value) FL_NOEXCEPT;
252float sin_impl_float(float value) FL_NOEXCEPT;
253double sin_impl_double(double value) FL_NOEXCEPT;
254float cos_impl_float(float value) FL_NOEXCEPT;
255double cos_impl_double(double value) FL_NOEXCEPT;
256float log_impl_float(float value) FL_NOEXCEPT;
257double log_impl_double(double value) FL_NOEXCEPT;
259double log10_impl_double(double value) FL_NOEXCEPT;
260float pow_impl_float(float base, float exponent) FL_NOEXCEPT;
261double pow_impl_double(double base, double exponent) FL_NOEXCEPT;
263double fabs_impl_double(double value) FL_NOEXCEPT;
267double round_impl_double(double value) FL_NOEXCEPT;
268float fmod_impl_float(float x, float y) FL_NOEXCEPT;
269double fmod_impl_double(double x, double y) FL_NOEXCEPT;
270float atan2_impl_float(float y, float x) FL_NOEXCEPT;
271double atan2_impl_double(double y, double x) FL_NOEXCEPT;
272float hypot_impl_float(float x, float y) FL_NOEXCEPT;
273double hypot_impl_double(double x, double y) FL_NOEXCEPT;
275double atan_impl_double(double value) FL_NOEXCEPT;
277double asin_impl_double(double value) FL_NOEXCEPT;
279double acos_impl_double(double value) FL_NOEXCEPT;
280float tan_impl_float(float value) FL_NOEXCEPT;
281double tan_impl_double(double value) FL_NOEXCEPT;
282float ldexp_impl_float(float value, int exp) FL_NOEXCEPT;
283double ldexp_impl_double(double value, int exp) FL_NOEXCEPT;
284
285// ===== Constexpr helpers =====================================================
286
287constexpr int ceil_constexpr(float value) FL_NOEXCEPT {
288 return static_cast<int>((value > static_cast<float>(static_cast<int>(value)))
289 ? static_cast<int>(value) + 1
290 : static_cast<int>(value));
291}
292
293// ===== Rounding ==============================================================
294//
295// Pattern for each function:
296// 1. Explicit float version (f-suffix, e.g. floorf)
297// 2. Explicit double version (no suffix, e.g. floor)
298// 3. Integral promotion template — accepts integer types, returns float
299//
300// Fixed-point overloads live in fl/math/fixed_point.h and are guarded by
301// enable_if<is_fixed_point<T>>, so there is no ambiguity.
302
303// floor
304inline float floorf(float value) FL_NOEXCEPT { return floor_impl_float(value); }
305inline double floor(double value) FL_NOEXCEPT { return floor_impl_double(value); }
306template<typename T> inline typename enable_if<is_integral<T>::value, float>::type
307floor(T value) FL_NOEXCEPT { return floor_impl_float(static_cast<float>(value)); }
308
309// ceil
310inline float ceilf(float value) FL_NOEXCEPT { return ceil_impl_float(value); }
311inline double ceil(double value) FL_NOEXCEPT { return ceil_impl_double(value); }
312template<typename T> inline typename enable_if<is_integral<T>::value, float>::type
313ceil(T value) FL_NOEXCEPT { return ceil_impl_float(static_cast<float>(value)); }
314
315// round — template form avoids "using fl::round" conflict with ::round
316inline float roundf(float value) FL_NOEXCEPT { return round_impl_float(value); }
317template<typename T>
318inline typename enable_if<!is_integral<T>::value, T>::type
320 return static_cast<T>(round_impl_float(static_cast<float>(value)));
321}
322template<>
323inline double round<double>(double value) FL_NOEXCEPT {
324 return round_impl_double(value);
325}
326template<typename T> inline typename enable_if<is_integral<T>::value, float>::type
327round(T value) FL_NOEXCEPT { return static_cast<float>(value); }
328
329// lround
330inline long lroundf(float value) FL_NOEXCEPT { return lround_impl_float(value); }
331inline long lround(double value) FL_NOEXCEPT { return lround_impl_double(value); }
332template<typename T> inline typename enable_if<is_integral<T>::value, long>::type
333lround(T value) FL_NOEXCEPT { return static_cast<long>(value); }
334
335// fmod — template form avoids "using fl::fmod" conflict with ::fmod
336inline float fmodf(float x, float y) FL_NOEXCEPT { return fmod_impl_float(x, y); }
337template<typename T>
338inline typename enable_if<!is_integral<T>::value, T>::type
340 return static_cast<T>(fmod_impl_float(static_cast<float>(x), static_cast<float>(y)));
341}
342template<>
343inline double fmod<double>(double x, double y) FL_NOEXCEPT {
344 return fmod_impl_double(x, y);
345}
346template<typename T> inline typename enable_if<is_integral<T>::value, float>::type
347fmod(T x, T y) FL_NOEXCEPT { return fmod_impl_float(static_cast<float>(x), static_cast<float>(y)); }
348
349// ===== Trigonometry ==========================================================
350
351// sin
352inline float sinf(float value) FL_NOEXCEPT { return sin_impl_float(value); }
353inline double sin(double value) FL_NOEXCEPT { return sin_impl_double(value); }
354template<typename T> inline typename enable_if<is_integral<T>::value, float>::type
355sin(T value) FL_NOEXCEPT { return sin_impl_float(static_cast<float>(value)); }
356
357// cos
358inline float cosf(float value) FL_NOEXCEPT { return cos_impl_float(value); }
359inline double cos(double value) FL_NOEXCEPT { return cos_impl_double(value); }
360template<typename T> inline typename enable_if<is_integral<T>::value, float>::type
361cos(T value) FL_NOEXCEPT { return cos_impl_float(static_cast<float>(value)); }
362
363// tan
364inline float tanf(float value) FL_NOEXCEPT { return tan_impl_float(value); }
365inline double tan(double value) FL_NOEXCEPT { return tan_impl_double(value); }
366template<typename T> inline typename enable_if<is_integral<T>::value, float>::type
367tan(T value) FL_NOEXCEPT { return tan_impl_float(static_cast<float>(value)); }
368
369// ===== Inverse trigonometry ==================================================
370
371// asin
372inline float asinf(float value) FL_NOEXCEPT { return asin_impl_float(value); }
373inline double asin(double value) FL_NOEXCEPT { return asin_impl_double(value); }
374template<typename T> inline typename enable_if<is_integral<T>::value, float>::type
375asin(T value) FL_NOEXCEPT { return asin_impl_float(static_cast<float>(value)); }
376
377// acos
378inline float acosf(float value) FL_NOEXCEPT { return acos_impl_float(value); }
379inline double acos(double value) FL_NOEXCEPT { return acos_impl_double(value); }
380template<typename T> inline typename enable_if<is_integral<T>::value, float>::type
381acos(T value) FL_NOEXCEPT { return acos_impl_float(static_cast<float>(value)); }
382
383// atan
384inline float atanf(float value) FL_NOEXCEPT { return atan_impl_float(value); }
385inline double atan(double value) FL_NOEXCEPT { return atan_impl_double(value); }
386template<typename T> inline typename enable_if<is_integral<T>::value, float>::type
387atan(T value) FL_NOEXCEPT { return atan_impl_float(static_cast<float>(value)); }
388
389// atan2
390inline float atan2f(float y, float x) FL_NOEXCEPT { return atan2_impl_float(y, x); }
391inline double atan2(double y, double x) FL_NOEXCEPT { return atan2_impl_double(y, x); }
392template<typename T> inline typename enable_if<is_integral<T>::value, float>::type
393atan2(T y, T x) FL_NOEXCEPT { return atan2_impl_float(static_cast<float>(y), static_cast<float>(x)); }
394
395// ===== Exponential / logarithmic =============================================
396
397// exp
398inline float expf(float value) FL_NOEXCEPT { return exp_impl_float(value); }
399inline double exp(double value) FL_NOEXCEPT { return exp_impl_double(value); }
400template<typename T> inline typename enable_if<is_integral<T>::value, float>::type
401exp(T value) FL_NOEXCEPT { return exp_impl_float(static_cast<float>(value)); }
402
403// log (natural) - fast approximate version
404// Uses IEEE 754 bit extraction + minimax quadratic. ~1.5% max relative error.
405// ~5-10x faster than standard logf on embedded targets.
406inline float fast_logf_approx(float x) FL_NOEXCEPT {
407 union { float f; u32 i; } u;
408 u.f = x;
409 i32 e = static_cast<i32>(u.i >> 23) - 127;
410 u.i = (u.i & 0x007FFFFFu) | 0x3F800000u;
411 float m = u.f;
412 float t = m - 1.0f;
413 float log2m = t * (1.3327635f + t * (-0.3327635f));
414 return (static_cast<float>(e) + log2m) * 0.6931471805599453f;
415}
416
417// log (natural)
418inline float logf(float value) FL_NOEXCEPT { return log_impl_float(value); }
419inline double log(double value) FL_NOEXCEPT { return log_impl_double(value); }
420template<typename T> inline typename enable_if<is_integral<T>::value, float>::type
421log(T value) FL_NOEXCEPT { return log_impl_float(static_cast<float>(value)); }
422
423// log10
424inline float log10f(float value) FL_NOEXCEPT { return log10_impl_float(value); }
425inline double log10(double value) FL_NOEXCEPT { return log10_impl_double(value); }
426template<typename T> inline typename enable_if<is_integral<T>::value, float>::type
427log10(T value) FL_NOEXCEPT { return log10_impl_float(static_cast<float>(value)); }
428
429// log2
430inline float log2f(float value) FL_NOEXCEPT { return log_impl_float(value) / log_impl_float(2.0f); }
431inline double log2(double value) FL_NOEXCEPT { return log_impl_double(value) / log_impl_double(2.0); }
432template<typename T> inline typename enable_if<is_integral<T>::value, float>::type
433log2(T value) FL_NOEXCEPT { return log_impl_float(static_cast<float>(value)) / log_impl_float(2.0f); }
434
435// pow
436inline float powf(float base, float exponent) FL_NOEXCEPT { return pow_impl_float(base, exponent); }
437inline double pow(double base, double exponent) FL_NOEXCEPT { return pow_impl_double(base, exponent); }
438template<typename T> inline typename enable_if<is_integral<T>::value, float>::type
439pow(T base, T exponent) FL_NOEXCEPT { return pow_impl_float(static_cast<float>(base), static_cast<float>(exponent)); }
440
441// ===== Roots / distance ======================================================
442
443namespace sqrt_detail {
444// Type trait to detect if T has a static sqrt method
445template<typename T, typename = void>
447
448template<typename T>
449struct has_static_sqrt<T, decltype(static_cast<void>(T::sqrt(declval<T>())))> : true_type {};
450}
451
452// sqrt
453inline float sqrtf(float value) FL_NOEXCEPT { return sqrt_impl_float(value); }
454inline float sqrt(float value) FL_NOEXCEPT { return sqrt_impl_float(value); }
455inline double sqrt(double value) FL_NOEXCEPT { return sqrt_impl_double(value); }
456template<typename T> inline typename enable_if<is_integral<T>::value, float>::type
457sqrt(T value) FL_NOEXCEPT { return sqrt_impl_float(static_cast<float>(value)); }
458
459// Generic sqrt that auto-binds to types with static sqrt method
460// If T doesn't have a static sqrt, this overload is discarded (SFINAE)
461template<typename T>
462inline typename enable_if<sqrt_detail::has_static_sqrt<T>::value, decltype(T::sqrt(declval<T>()))>::type
464 return T::sqrt(value);
465}
466
467namespace floor_detail {
468// Type trait to detect if T has a static floor method
469template<typename T, typename = void>
471
472template<typename T>
473struct has_static_floor<T, decltype(static_cast<void>(T::floor(declval<T>())))> : true_type {};
474}
475
476// Generic floor that auto-binds to types with static floor method
477template<typename T>
478inline typename enable_if<floor_detail::has_static_floor<T>::value, decltype(T::floor(declval<T>()))>::type
480 return T::floor(value);
481}
482
483namespace ceil_detail {
484// Type trait to detect if T has a static ceil method
485template<typename T, typename = void>
487
488template<typename T>
489struct has_static_ceil<T, decltype(static_cast<void>(T::ceil(declval<T>())))> : true_type {};
490}
491
492// Generic ceil that auto-binds to types with static ceil method
493template<typename T>
494inline typename enable_if<ceil_detail::has_static_ceil<T>::value, decltype(T::ceil(declval<T>()))>::type
496 return T::ceil(value);
497}
498
499// hypot
500inline float hypotf(float x, float y) FL_NOEXCEPT { return hypot_impl_float(x, y); }
501inline double hypot(double x, double y) FL_NOEXCEPT { return hypot_impl_double(x, y); }
502template<typename T> inline typename enable_if<is_integral<T>::value, float>::type
503hypot(T x, T y) FL_NOEXCEPT { return hypot_impl_float(static_cast<float>(x), static_cast<float>(y)); }
504
505// ===== Floating-point utilities ==============================================
506
507// fabs
508inline float fabsf(float value) FL_NOEXCEPT { return fabs_impl_float(value); }
509inline double fabs(double value) FL_NOEXCEPT { return fabs_impl_double(value); }
510template<typename T> inline typename enable_if<is_integral<T>::value, float>::type
511fabs(T value) FL_NOEXCEPT { return fabs_impl_float(static_cast<float>(value)); }
512
513// ldexp — multiply by power of 2: value * 2^exp
514inline float ldexpf(float value, int exp) FL_NOEXCEPT { return ldexp_impl_float(value, exp); }
515inline double ldexp(double value, int exp) FL_NOEXCEPT { return ldexp_impl_double(value, exp); }
516template<typename T> inline typename enable_if<is_integral<T>::value, float>::type
517ldexp(T value, int exp) FL_NOEXCEPT { return ldexp_impl_float(static_cast<float>(value), exp); }
518
519// ===== Angle conversion ======================================================
520
521template<typename T>
522constexpr inline T radians(T deg) FL_NOEXCEPT {
523 return deg * static_cast<T>(0.017453292519943295); // PI / 180
524}
525
526template<typename T>
527constexpr inline T degrees(T rad) FL_NOEXCEPT {
528 return rad * static_cast<T>(57.29577951308232); // 180 / PI
529}
530
531// ===== sincos ================================================================
532
533// sincos(angle, &out_sin, &out_cos) for floating-point types
534template <typename T>
535inline typename enable_if<is_floating_point<T>::value>::type
536sincos(T angle, T& out_sin, T& out_cos) FL_NOEXCEPT {
537 out_sin = static_cast<T>(fl::sinf(static_cast<float>(angle)));
538 out_cos = static_cast<T>(fl::cosf(static_cast<float>(angle)));
539}
540
541// sincos(angle, &out_sin, &out_cos) for integral types
542template <typename T>
543inline typename enable_if<is_integral<T>::value>::type
544sincos(T angle, float& out_sin, float& out_cos) FL_NOEXCEPT {
545 out_sin = fl::sinf(static_cast<float>(angle));
546 out_cos = fl::cosf(static_cast<float>(angle));
547}
548
549} // namespace fl
unsigned char u8
Definition stdint.h:131
#define FL_EPSILON_F
Definition math.h:38
double hypot_impl_double(double x, double y)
Definition math.cpp.hpp:520
FL_DISABLE_WARNING_PUSH U constexpr common_type_t< T, U > min(T a, U b) FL_NOEXCEPT
Definition math.h:71
long lround(double value) FL_NOEXCEPT
Definition math.h:331
unsigned char u8
Definition stdint.h:131
constexpr int ceil_constexpr(float value) FL_NOEXCEPT
Definition math.h:287
double atan2_impl_double(double y, double x)
Definition math.cpp.hpp:504
float log_impl_float(float value)
Definition math.cpp.hpp:288
float fabs_impl_float(float value)
Definition math.cpp.hpp:355
float sqrtf(float value) FL_NOEXCEPT
Definition math.h:453
typename common_type< T, U >::type common_type_t
double hypot(double x, double y) FL_NOEXCEPT
Definition math.h:501
double fabs(double value) FL_NOEXCEPT
Definition math.h:509
constexpr int type_rank< T >::value
double sqrt_impl_double(double value)
Definition math.cpp.hpp:248
enable_if< is_fixed_point< T >::value, T >::type atan2(T y, T x) FL_NOEXCEPT
double ldexp(double value, int exp) FL_NOEXCEPT
Definition math.h:515
constexpr common_type_t< T, U > max(T a, U b) FL_NOEXCEPT
Definition math.h:75
float roundf(float value) FL_NOEXCEPT
Definition math.h:316
float powf(float base, float exponent) FL_NOEXCEPT
Definition math.h:436
double atan_impl_double(double value)
Definition math.cpp.hpp:536
double cos_impl_double(double value)
Definition math.cpp.hpp:280
float expf(float value) FL_NOEXCEPT
Definition math.h:398
MapRedBlackTree< Key, T, Compare, fl::allocator_slab< char > > map
Definition map.h:283
float floorf(float value) FL_NOEXCEPT
Definition math.h:304
float exp_impl_float(float value)
Definition math.cpp.hpp:80
constexpr enable_if< is_fixed_point< T >::value, T >::type ceil(T x) FL_NOEXCEPT
double pow_impl_double(double base, double exponent)
Definition math.cpp.hpp:338
FASTLED_FORCE_INLINE U map_range(T value, T in_min, T in_max, U out_min, U out_max) FL_NOEXCEPT
Definition math.h:174
add_rvalue_reference< T >::type declval() FL_NOEXCEPT
float ceil_impl_float(float value)
Definition math.cpp.hpp:61
enable_if< is_fixed_point< T >::value, void >::type sincos(T angle, T &out_sin, T &out_cos) FL_NOEXCEPT
double tan_impl_double(double value)
Definition math.cpp.hpp:598
constexpr enable_if< is_fixed_point< T >::value, T >::type sqrt(T x) FL_NOEXCEPT
double sin_impl_double(double value)
Definition math.cpp.hpp:264
double acos_impl_double(double value)
Definition math.cpp.hpp:579
integral_constant< bool, false > false_type
Definition type_traits.h:28
double log2(double value) FL_NOEXCEPT
Definition math.h:431
float fmod_impl_float(float x, float y)
Definition math.cpp.hpp:401
float log10_impl_float(float value)
Definition math.cpp.hpp:304
double ldexp_impl_double(double value, int exp)
Definition math.cpp.hpp:653
float atan2_impl_float(float y, float x)
Definition math.cpp.hpp:496
constexpr enable_if< is_fixed_point< T >::value, T >::type floor(T x) FL_NOEXCEPT
float sinf(float value) FL_NOEXCEPT
Definition math.h:352
double fabs_impl_double(double value)
Definition math.cpp.hpp:359
constexpr bool almost_equal(T a, T b, U tolerance) FL_NOEXCEPT
Definition math.h:90
float log10f(float value) FL_NOEXCEPT
Definition math.h:424
bool equal(Iterator1 first1, Iterator1 last1, Iterator2 first2) FL_NOEXCEPT
Definition algorithm.h:96
constexpr enable_if< is_fixed_point< T >::value, int >::type sign(T x) FL_NOEXCEPT
double log(double value) FL_NOEXCEPT
Definition math.h:419
double log_impl_double(double value)
Definition math.cpp.hpp:296
double floor_impl_double(double value)
Definition math.cpp.hpp:52
float ceilf(float value) FL_NOEXCEPT
Definition math.h:310
long lroundf(float value) FL_NOEXCEPT
Definition math.h:330
float acos_impl_float(float value)
Definition math.cpp.hpp:570
enable_if< is_fixed_point< T >::value, T >::type acos(T x) FL_NOEXCEPT
float fast_logf_approx(float x) FL_NOEXCEPT
Definition math.h:406
double log10_impl_double(double value)
Definition math.cpp.hpp:313
float round_impl_float(float value)
Definition math.cpp.hpp:384
double round< double >(double value) FL_NOEXCEPT
Definition math.h:323
constexpr T radians(T deg) FL_NOEXCEPT
Definition math.h:522
float asinf(float value) FL_NOEXCEPT
Definition math.h:372
float fmodf(float x, float y) FL_NOEXCEPT
Definition math.h:336
float cos_impl_float(float value)
Definition math.cpp.hpp:272
float fabsf(float value) FL_NOEXCEPT
Definition math.h:508
enable_if< is_fixed_point< T >::value, T >::type pow(T base, T exp) FL_NOEXCEPT
double round_impl_double(double value)
Definition math.cpp.hpp:392
float pow_impl_float(float base, float exponent)
Definition math.cpp.hpp:322
float atanf(float value) FL_NOEXCEPT
Definition math.h:384
long lround_impl_float(float value)
Definition math.cpp.hpp:363
float ldexpf(float value, int exp) FL_NOEXCEPT
Definition math.h:514
enable_if< is_fixed_point< T >::value, T >::type cos(T angle) FL_NOEXCEPT
float hypot_impl_float(float x, float y)
Definition math.cpp.hpp:512
double tan(double value) FL_NOEXCEPT
Definition math.h:365
enable_if<!is_integral< T >::value, T >::type fmod(T x, T y) FL_NOEXCEPT
Definition math.h:339
float tanf(float value) FL_NOEXCEPT
Definition math.h:364
float sqrt_impl_float(float value)
Definition math.cpp.hpp:240
double ceil_impl_double(double value)
Definition math.cpp.hpp:70
float tan_impl_float(float value)
Definition math.cpp.hpp:588
double fmod< double >(double x, double y) FL_NOEXCEPT
Definition math.h:343
double fmod_impl_double(double x, double y)
Definition math.cpp.hpp:413
FASTLED_FORCE_INLINE U map_range_clamped(T value, T in_min, T in_max, U out_min, U out_max) FL_NOEXCEPT
Definition math.h:186
float atan_impl_float(float value)
Definition math.cpp.hpp:528
float sin_impl_float(float value)
Definition math.cpp.hpp:256
float hypotf(float x, float y) FL_NOEXCEPT
Definition math.h:500
enable_if< is_fixed_point< T >::value, T >::type sin(T angle) FL_NOEXCEPT
double log10(double value) FL_NOEXCEPT
Definition math.h:425
float floor_impl_float(float value)
Definition math.cpp.hpp:43
float acosf(float value) FL_NOEXCEPT
Definition math.h:378
long lround_impl_double(double value)
Definition math.cpp.hpp:372
float log2f(float value) FL_NOEXCEPT
Definition math.h:430
enable_if< is_fixed_point< T >::value, T >::type asin(T x) FL_NOEXCEPT
float asin_impl_float(float value)
Definition math.cpp.hpp:544
float cosf(float value) FL_NOEXCEPT
Definition math.h:358
float atan2f(float y, float x) FL_NOEXCEPT
Definition math.h:390
double asin_impl_double(double value)
Definition math.cpp.hpp:557
enable_if< is_fixed_point< T >::value, T >::type exp(T x) FL_NOEXCEPT
integral_constant< bool, true > true_type
Definition type_traits.h:27
double exp_impl_double(double value)
Definition math.cpp.hpp:101
constexpr enable_if< is_fixed_point< T >::value, T >::type abs(T x) FL_NOEXCEPT
float logf(float value) FL_NOEXCEPT
Definition math.h:418
constexpr T degrees(T rad) FL_NOEXCEPT
Definition math.h:527
enable_if< is_fixed_point< T >::value, T >::type atan(T x) FL_NOEXCEPT
constexpr enable_if< is_fixed_point< T >::value, T >::type clamp(T x, T lo, T hi) FL_NOEXCEPT
float ldexp_impl_float(float value, int exp)
Definition math.cpp.hpp:645
Base definition for an LED controller.
Definition crgb.hpp:179
#define FL_DISABLE_WARNING(warning)
#define FL_DISABLE_WARNING_IMPLICIT_INT_CONVERSION
#define FASTLED_FORCE_INLINE
#define FL_DISABLE_WARNING_PUSH
#define FL_DISABLE_WARNING_SIGN_CONVERSION
#define FL_DISABLE_WARNING_POP
#define FL_DISABLE_WARNING_FLOAT_CONVERSION
#define FL_NOEXCEPT
#define round(x)
Definition util.h:11