14 #include "../GrayLibBase.h"
29 static const float k_FLT_MAX2 = ((float)INT_MAX);
30 static const float k_FLT_MIN2 = 0.0001f;
35 template<
typename TYPE =
double >
68 template<
typename TYPE >
73 return((a > 0) ? 1 : ((a < 0) ? -1 : 0));
75 template<
typename TYPE >
80 return(n >= low && n <= high);
82 template<
typename TYPE >
87 return IsInRange(n, a, b);
89 return IsInRange(n, b, a);
91 template<
typename TYPE >
95 return (a < b) ? a : b;
97 template<
typename TYPE >
101 return (a < b) ? b : a;
103 template<
typename TYPE >
110 template<
typename TYPE >
122 template<
typename TYPE >
131 else if (value > high)
134 template<
typename TYPE >
138 return Abs(n1 - n2) <= nDiff ;
140 template<
typename TYPE >
147 template<
typename TYPE >
149 template<
typename TYPE >
152 template<
typename TYPE >
157 TYPE nTmp = Mod(nVal, nMod);
169 return ((a ^ b) < 0);
172 template<
typename TYPE >
191 template <
typename TYPE>
202 template <
typename TYPE>
206 #define DIVIDEUP(a,b) (((a) + ((b) - 1)) / (b))
210 template <
typename TYPE>
216 TYPE nResult = a + b;
220 bCarry = (nResult <= b);
225 bCarry = (nResult < b);
230 template <
typename TYPE>
235 TYPE nResult = a - b;
239 bBorrow = (nResult >= a);
244 bBorrow = (nResult > a);
254 template <
typename TYPE>
258 return (nVal | ((
TYPE)(-nVal))) >> ((
sizeof(nVal) * 8) - 1);
261 static int GRAYCALL Log2Est(UINT iVal);
269 #define _FFF(c) (float) c
274 template<>
inline float CalcI::Abs<float>(
float a) noexcept
278 template<>
inline float CalcI::Mod<float>(
float a,
float b)
280 return ::fmodf(a, b);
283 template<>
inline double CalcI::Abs<double>(
double a) noexcept
287 template<>
inline double CalcI::Mod<double>(
double a,
double b)
293 template<>
inline int CalcI::Abs<int>(
int a) noexcept
297 template<>
inline int CalcI::Mod<int>(
int a,
int b)
302 template<>
inline UINT CalcI::Abs<UINT>(UINT a) noexcept
307 template<>
inline UINT CalcI::Mod<UINT>(UINT a, UINT b)
312 template<>
inline UINT16 CalcI::MulDiv<UINT16>(UINT16 a, UINT16 b, UINT16 c)
316 return (UINT16)(((UINT32)a*(UINT32)b) / c);
320 template<>
inline UINT32 CalcI::MulDiv<UINT32>(UINT32 a, UINT32 b, UINT32 c)
324 return (UINT32)(((UINT64)a*(UINT64)b) / c);
329 template<>
inline UINT64 CalcI::MulDiv<UINT64>(UINT64 a, UINT64 b, UINT64 c)
335 UINT64 l = _umul128(a, b, &h);
355 template<
typename TYPE >
359 return ((a >= 0) ^ (b >= 0));
362 template<
typename TYPE >
370 template<
typename TYPE >
375 TYPE nTmp = WrapRadians(nRadians);
380 template<
typename TYPE >
385 return WrapRadiansSigned(n1 - n2);
387 template<
typename TYPE >
393 template<
typename TYPE >
399 template<
typename TYPE >
404 return(nVal1 + ((nVal2 - nVal1) * fRatio));
407 template<
typename TYPE >
412 return Floor(a + (
TYPE) 0.5);
414 return Ceil(a - (
TYPE) 0.5);
417 template<
typename TYPE >
421 return a == Floor(a);
425 template<
typename TYPE >
427 template<
typename TYPE >
429 template<
typename TYPE >
436 template<
typename TYPE >
438 template<
typename TYPE >
440 template<
typename TYPE >
444 template<
typename TYPE >
447 template<
typename TYPE >
449 template<
typename TYPE >
451 template<
typename TYPE >
456 template<
typename TYPE >
459 template<
typename TYPE >
461 template<
typename TYPE >
465 template<
typename TYPE >
468 template<
typename TYPE >
474 template<
typename TYPE >
482 template<
typename TYPE >
485 template<
typename TYPE >
492 template<
typename TYPE >
496 return Log(x) / Log(b);
504 template<>
inline float Calc::Floor<float>(
float a)
506 return _FFF(::floor)(a);
508 template<>
inline float Calc::Ceil<float>(
float a)
510 return _FFF(::ceil)(a);
512 template<>
inline float Calc::Sqrt<float>(
float a)
514 return _FFF(::sqrt)(a);
516 template<>
inline float Calc::Sin<float>(
float a)
519 return _FFF(::sin)(a);
521 template<>
inline float Calc::Cos<float>(
float a)
524 return _FFF(::cos)(a);
526 template<>
inline float Calc::Tan<float>(
float a)
529 return _FFF(::tan)(a);
531 template<>
inline void Calc::SinCos<float>(
float a,
float& s,
float& c)
535 #if defined(_MSC_VER) && !defined(USE_64BIT)
550 template<>
inline float Calc::ASin<float>(
float a)
552 return _FFF(::asin)(a);
554 template<>
inline float Calc::ACos<float>(
float a)
556 return _FFF(::acos)(a);
558 template<>
inline float Calc::ATan<float>(
float a)
560 return _FFF(::atan)(a);
562 template<>
inline float Calc::ATan2<float>(
float y,
float x)
564 return _FFF(::atan2)(y, x);
566 template<>
inline float Calc::Log<float>(
float a)
568 return _FFF(::log)(a);
570 template<>
inline float Calc::Log10<float>(
float a)
572 return _FFF(::log10)(a);
574 template<>
inline float Calc::Exp<float>(
float a)
576 return _FFF(::exp)(a);
578 template<>
inline float Calc::Pow<float>(
float a,
float nExp)
580 return _FFF(::pow)(a, nExp);
587 template<>
inline double Calc::Floor<double>(
double a)
591 template<>
inline double Calc::Ceil<double>(
double a)
595 template<>
inline double Calc::Sqrt<double>(
double a)
599 template<>
inline double Calc::Sin<double>(
double a)
603 template<>
inline double Calc::Cos<double>(
double a)
607 template<>
inline double Calc::Tan<double>(
double a)
611 template<>
inline void Calc::SinCos<double>(
double a,
double& s,
double& c)
615 #if defined(_MSC_VER) && !defined(USE_64BIT)
619 mov eax, dword ptr[c]
620 mov ebx, dword ptr[s]
630 template<>
inline double Calc::ASin<double>(
double a)
634 template<>
inline double Calc::ACos<double>(
double a)
638 template<>
inline double Calc::ATan<double>(
double a)
642 template<>
inline double Calc::ATan2<double>(
double y,
double x)
644 return ::atan2(y, x);
646 template<>
inline double Calc::Log<double>(
double a)
650 template<>
inline double Calc::Log10<double>(
double a)
654 template<>
inline double Calc::Exp<double>(
double a)
658 template<>
inline double Calc::Pow<double>(
double a,
double nExp)
660 return ::pow(a, nExp);
#define _FFF(c)
Definition: Calc.h:271
#define GRAYCALL
declare calling convention for static functions so everyone knows the arg passing scheme....
Definition: GrayCore.h:36
#define GRAYLIB_LINK
Definition: GrayLibBase.h:35
#define TYPE
Definition: StrT.cpp:38
#define ASSERT(exp)
Definition: cDebugAssert.h:87
UNITTEST2_PREDEF(cQuadtree)
int Percent10_t
tenths of a percent. 0 to 1000 = 0 to 100.0
Definition: Calc.h:32
float RADIANf_t
type is float radians
Definition: Calc.h:27
static TYPE MulDiv(TYPE a, TYPE b, TYPE c)
Definition: Calc.h:192
static TYPE Max(TYPE a, TYPE b) noexcept
Definition: Calc.h:98
static bool IsInRange(TYPE n, TYPE low, TYPE high) noexcept
Definition: Calc.h:76
static TYPE SubC(TYPE a, TYPE b, bool &bBorrow) noexcept
Definition: Calc.h:231
static bool ToBool(TYPE nVal) noexcept
Definition: Calc.h:255
static bool IsInBetween(TYPE n, TYPE a, TYPE b) noexcept
Definition: Calc.h:83
static TYPE Wrap(TYPE nVal, TYPE nMod)
Definition: Calc.h:153
static TYPE Max3(TYPE a, TYPE b, TYPE c) noexcept
Definition: Calc.h:104
static TYPE Abs(TYPE a) noexcept
similar to ABS(n) macro. Does nothing for unsigned types.
static TYPE Mod(TYPE a, TYPE b)
a modulus b = remainder of a/b
static TYPE Min(TYPE a, TYPE b) noexcept
Definition: Calc.h:92
static void ClampRef(TYPE &rValue, TYPE low, TYPE high)
Definition: Calc.h:123
static TYPE GetGreatestCommonDivisor(TYPE x, TYPE y)
Definition: Calc.h:173
static bool IsNear(TYPE n1, TYPE n2, TYPE nDiff=(TYPE) k_FLT_MIN2) noexcept
Definition: Calc.h:135
static TYPE Clamp(TYPE value, TYPE low, TYPE high)
Definition: Calc.h:111
static TYPE Sqr(TYPE a) noexcept
Definition: Calc.h:141
static TYPE AddC(TYPE a, TYPE b, bool &bCarry) noexcept
Definition: Calc.h:211
static int Sign(TYPE a)
Definition: Calc.h:69
static bool IsSignDiff(int a, int b) noexcept
Definition: Calc.h:166
static TYPE DivideUp(TYPE a, TYPE b)
Definition: Calc.h:203
static TYPE GetDiffRadians(TYPE n1, TYPE n2) noexcept
Definition: Calc.h:381
static TYPE WrapRadiansSigned(TYPE nRadians) noexcept
Definition: Calc.h:371
static TYPE Floor(TYPE a)
get the closest whole integer. positive or negative values.
static TYPE WrapRadians(TYPE nRadians) noexcept
Definition: Calc.h:363
static TYPE Log10(TYPE a)
static bool IsInteger(TYPE a)
Definition: Calc.h:418
static TYPE Log2(TYPE a)
Definition: Calc.h:486
static TYPE Sqrt(TYPE a)
Definition: Calc.h:430
static TYPE Radian2Degree(TYPE nRadians) noexcept
Definition: Calc.h:394
static TYPE Pow2(TYPE x)
Definition: Calc.h:475
static void SinCos(TYPE a, TYPE &s, TYPE &c)
get both sin and cos at one time. a = Euler angle in radians
static TYPE Round(TYPE a)
Definition: Calc.h:408
static TYPE Degree2Radian(TYPE nDegree) noexcept
Definition: Calc.h:388
static TYPE Pow10(TYPE x)
Definition: Calc.h:469
static bool IsSignDiff(TYPE a, TYPE b) noexcept
Definition: Calc.h:356
static TYPE LogN(TYPE x, TYPE b=10)
Definition: Calc.h:493
static TYPE Pow(TYPE nBase, TYPE nExp)
pow(nBase,nExp) = exp( log(nBase) * nExp );
static TYPE Lerp(TYPE nVal1, TYPE nVal2, TYPE fRatio) noexcept
Definition: Calc.h:400
static TYPE ATan2(TYPE y, TYPE x)
static TYPE Log(TYPE a)
Natural (e) log. // negative will throw ?
static const TYPE k_PIHalf
Half PI.
Definition: Calc.h:54
static const TYPE k_PI2
PI times 2. M_PI.
Definition: Calc.h:53
static const TYPE k_e
M_E = 2.718281828...
Definition: Calc.h:56
static const TYPE k_MaxSqrt
The square root of <= k_Max. Not Max+1.
Definition: Calc.h:48
static const TYPE k_Epsilon
smallest positive value such that (1.0+FLT_EPSILON != 1.0)
Definition: Calc.h:49
static const TYPE k_PI
PI as a float or double. like M_PI, D3DX_PI.
Definition: Calc.h:52
static const TYPE k_Log10e
M_LOG10E = log10(e) = 1/ln(10)
Definition: Calc.h:58
static const TYPE k_Ln10
M_LN10 = ln(10) = 1/log10(e)
Definition: Calc.h:60
static const TYPE k_MinPos
The min value that is positive and > 0. AKA FLT_MIN and DBL_MIN.
Definition: Calc.h:47
static const TYPE k_Ln2
M_LN2 = ln(2) = 1/log2(e)
Definition: Calc.h:59
static const TYPE k_Log2e
M_LOG2E = log2(e) = 1/ln(2)
Definition: Calc.h:57