48#define LASS_NUM_INVLOG2 1.442695040888963407359924681001892137426645954152985934135449406931109219181185079885526622893506344
49#define LASS_NUM_INVLOG10 0.434294481903251827651128918916605082294397005803666566114453783165864649208870774729224949338431748
57 typedef typename NumTraits<T>::signedType TSigned;
58 typedef typename NumTraits<T>::unsignedType TUnsigned;
59 typedef typename meta::Select< meta::Bool<
sizeof(T) <
sizeof(
int) >, int, T >::Type TTemp;
60 typedef typename meta::Select< meta::Bool<
sizeof(TUnsigned) <
sizeof(
unsigned) >, unsigned, TUnsigned >::Type TExponent;
62 static T eval(T x, TSigned exponent)
64 LASS_ASSERT(exponent >= 0);
65 return eval(x,
static_cast<TUnsigned
>(exponent));
68 static T eval(T x, TUnsigned exponent)
76 TTemp partialPower = 1;
77 TExponent e = exponent;
83 result *= partialPower;
88 return static_cast<T
>(result);
95 typedef typename NumTraits<T>::signedType TSigned;
96 typedef typename NumTraits<T>::unsignedType TUnsigned;
98 static T eval(TSigned x, TSigned m)
101 const TSigned tempDiv =
static_cast<TSigned
>(x / m);
102 return x % m >= 0 ? tempDiv :
static_cast<TSigned
>(tempDiv - 1);
105 static T eval(TSigned x, TUnsigned m)
108 const TSigned signedMod =
static_cast<TSigned
>(m);
109 LASS_ASSERT(signedMod >= 0);
110 const TSigned tempDiv =
static_cast<TSigned
>(x / signedMod);
111 return x % signedMod >= 0 ? tempDiv :
static_cast<TSigned
>(tempDiv - 1);
118 typedef typename NumTraits<T>::signedType TSigned;
119 typedef typename NumTraits<T>::unsignedType TUnsigned;
121 static T eval(TSigned x, TSigned m)
124 const TSigned tempMod =
static_cast<TSigned
>(x % m);
125 return tempMod >= 0 ? tempMod :
static_cast<TSigned
>(tempMod + m);
128 static TUnsigned eval(TSigned x, TUnsigned m)
131 const TSigned signedMod =
static_cast<TSigned
>(m);
132 LASS_ASSERT(signedMod >= 0);
133 const TSigned tempMod =
static_cast<TSigned
>(x % signedMod);
134 return static_cast<TUnsigned
>(tempMod >= 0 ? tempMod : tempMod + signedMod);
145template <
typename T>
inline T
abs(
const T& x)
147 return x < T() ? -x : x;
153template <
typename T>
inline T
sign(
const T& x)
156 return x > zero ? T(1) : (x < zero ? T(-1) : zero);
162template <
typename T>
inline T
sqr(
const T& x)
170template <
typename T>
inline T
cubic(
const T& x)
178template <
typename T>
inline T
inv(
const T& x)
187template <
typename T>
inline T
pow(
const T& x,
const T& p)
189 return exp(p * log(x));
195template <
typename T>
inline T
log2(
const T& x)
197 return T(LASS_NUM_INVLOG2) * log(x);
203template <
typename T>
inline T
log10(
const T& x)
205 return T(LASS_NUM_INVLOG10) * log(x);
211template <
typename T>
inline T
norm(
const T& x)
218template <
typename T>
inline T
conj(
const T& x)
226template <
typename T>
inline const T&
clamp(
const T& x,
const T& min,
const T& max)
228 return x < min ? min : (x > max ? max : x);
234template <
typename T>
inline T
lerp(
const T& a,
const T& b,
const T& f)
236 return a + f * (b - a);
241template<
typename T,
typename f> T applyFunction(
const T& x, f func )
250template <
typename T>
void inpabs(T& x) { x = num::abs(x); }
251template <
typename T>
void inpsign(T& x) { x = num::sign(x); }
252template <
typename T>
void inpinv(T& x) { x = num::inv(x); }
253template <
typename T>
void inpsqrt(T& x) { x = num::sqrt(x); }
254template <
typename T>
void inpsqr(T& x) { x = num::sqr(x); }
255template <
typename T>
void inpcubic(T& x) { x = num::cubic(x); }
256template <
typename T>
void inppow(T& x,
const T& p) { x = num::pow(x, p); }
257template <
typename T>
void inpexp(T& x) { x = num::exp(x); }
258template <
typename T>
void inplog(T& x) { x = num::log(x); }
259template <
typename T>
void inpcos(T& x) { x = num::cos(x); }
260template <
typename T>
void inpsin(T& x) { x = num::sin(x); }
261template <
typename T>
void inptan(T& x) { x = num::tan(x); }
262template <
typename T>
void inpacos(T& x) { x = num::acos(x); }
263template <
typename T>
void inpasin(T& x) { x = num::asin(x); }
264template <
typename T>
void inpatan(T& x) { x = num::atan(x); }
265template <
typename T>
void inpatan2(T& y,
const T& x) { y = num::atan2(y, x); }
266template <
typename T>
void inpfloor(T& x) { x = num::floor(x); }
267template <
typename T>
void inpceil(T& x) { x = num::ceil(x); }
268template <
typename T>
void inpround(T& x) { x = num::round(x); }
269template <
typename T>
void inpfractional(T& x) { x -= num::floor(x); }
270template <
typename T>
void inpdiv(T& x,
const T& m) { x = num::div(x, m); }
271template <
typename T>
void inpmod(T& x,
const T& m) { x = num::mod(x, m); }
272template <
typename T>
void inpclamp(T& x,
const T& min,
const T& max) { x = num::clamp(x, min, max); }
274template <
typename T>
void compnorm(
const T& x, T& y) { y = num::norm(x); }
275template <
typename T>
void compinv(
const T& x, T& y) { y = num::inv(x); }
281float abs(
float x) { return ::fabsf(x); }
282float inv(
float x) {
return 1.f / x; }
283float sqrt(
float x) { LASS_ASSERT(!(x < 0.f)); return ::sqrtf(x); }
284float pow(
float x,
float p) { return ::powf(x, p); }
285float exp(
float x) { return ::expf(x); }
286float log(
float x) { return ::logf(x); }
287float log2(
float x) {
return float(LASS_NUM_INVLOG2) * ::logf(x); }
288float log10(
float x) { return ::log10f(x); }
289float cos(
float x) { return ::cosf(x); }
290float sin(
float x) { return ::sinf(x); }
291float tan(
float x) { return ::tanf(x); }
292float acos(
float x) { return ::acosf(x); }
293float asin(
float x) { return ::asinf(x); }
294float atan(
float x) { return ::atanf(x); }
295float atan2(
float y,
float x) { return ::atan2f(y, x); }
296float floor(
float x) { return ::floorf(x); }
297float ceil(
float x) { return ::ceilf(x); }
298float round(
float x) { return ::floorf(x + .5f); }
299float fractional(
float x) {
return x - ::floorf(x); }
301#if LASS_COMPILER_TYPE == LASS_COMPILER_TYPE_MSVC
302# pragma warning(push)
303# pragma warning(disable: 4723)
305float sinc(
float x) { return ::fabsf(x) < 1e-4f ? 1.f : (::sinf(x) / x); }
306#if LASS_COMPILER_TYPE == LASS_COMPILER_TYPE_MSVC
311float mod(
float x,
float m)
313 const float result = ::fmodf(x, m);
314 return result < 0.f ? result + m : result;
318float fastSin(
float x)
320 const float a = 1.2732395447351628f;
321 const float b = -0.4052847345693511f;
322 const float c = 0.2248391028f;
323 const float y = a * x + b * x * fabsf(x);
324 return c * (y * fabsf(y) - y) + y;
333 if (num::abs(x) < 1e-4)
335 return x + .5f * x * x;
337 return num::exp(x) - 1;
347 if (num::abs(x) < 1e-4)
349 return x - .5f * x * x;
351 return num::log(1 + x);
357double abs(
double x) { return ::fabs(x); }
358double inv(
double x) {
return 1. / x; }
359double sqrt(
double x) { LASS_ASSERT(!(x < 0.)); return ::sqrt(x); }
360double pow(
double x,
double p) { return ::pow(x, p); }
361double exp(
double x) { return ::exp(x); }
362double log(
double x) { return ::log(x); }
363double log2(
double x) {
return double(LASS_NUM_INVLOG2) * ::log(x); }
364double log10(
double x) { return ::log10(x); }
365double cos(
double x) { return ::cos(x); }
366double sin(
double x) { return ::sin(x); }
367double tan(
double x) { return ::tan(x); }
368double acos(
double x) { return ::acos(x); }
369double asin(
double x) { return ::asin(x); }
370double atan(
double x) { return ::atan(x); }
371double atan2(
double y,
double x) { return ::atan2(y, x); }
372double floor(
double x) { return ::floor(x); }
373double ceil(
double x) { return ::ceil(x); }
374double round(
double x) { return ::floor(x + .5); }
375double fractional(
double x) {
return x - ::floor(x); }
377#if LASS_COMPILER_TYPE == LASS_COMPILER_TYPE_MSVC
378# pragma warning(push)
379# pragma warning(disable: 4723)
381double sinc(
double x) { return ::fabs(x) < 1e-8 ? 1. : (::sin(x) / x); }
382#if LASS_COMPILER_TYPE == LASS_COMPILER_TYPE_MSVC
387double mod(
double x,
double m)
389 const double result = ::fmod(x, m);
390 return result < 0. ? result + m : result;
394double fastSin(
double x)
396 const double a = 1.2732395447351628;
397 const double b = -0.4052847345693511;
398 const double c = 0.2248391028;
399 const double y = a * x + b * x * fabs(x);
400 return c * (y * fabs(y) - y) + y;
404double expm1(
double x)
409 if (num::abs(x) < 1e-8)
411 return x + .5 * x * x;
413 return num::exp(x) - 1;
418double log1p(
double x)
423 if (num::abs(x) < 1e-8)
425 return x - .5f * x * x;
427 return num::log(1 + x);
434#ifdef LASS_NUM_BASIC_OPS_USE_BUILTIN_LONG_DOUBLE
436long double abs(
long double x) {
return __builtin_fabsl(x); }
437long double inv(
long double x) {
return 1. / x; }
438long double sqrt(
long double x) { LASS_ASSERT(!(x < 0.));
return __builtin_sqrtl(x); }
439long double pow(
long double x,
long double p) {
return __builtin_powl(x, p); }
440long double exp(
long double x) {
return __builtin_expl(x); }
441long double log(
long double x) {
return __builtin_logl(x); }
442long double log2(
long double x) {
return (
long double)(LASS_NUM_INVLOG2) * __builtin_logl(x); }
443long double log10(
long double x) {
return __builtin_log10l(x); }
444long double cos(
long double x) {
return __builtin_cosl(x); }
445long double sin(
long double x) {
return __builtin_sinl(x); }
446long double tan(
long double x) {
return __builtin_tanl(x); }
447long double acos(
long double x) {
return __builtin_acosl(x); }
448long double asin(
long double x) {
return __builtin_asinl(x); }
449long double atan(
long double x) {
return __builtin_atanl(x); }
450long double atan2(
long double y,
long double x) {
return __builtin_atan2l(y, x); }
451long double sinc(
long double x) {
return __builtin_fabsl(x) < 1e-10 ? 1. : (__builtin_sinl(x) / x); }
452long double floor(
long double x) {
return __builtin_floorl(x); }
453long double ceil(
long double x) {
return __builtin_ceill(x); }
454long double round(
long double x) {
return __builtin_floorl(x + .5); }
455long double fractional(
long double x) {
return x - __builtin_floorl(x); }
458long double mod(
long double x,
long double m)
460 const long double result = __builtin_fmodl(x, m);
461 return result < 0. ? result + m : result;
464#elif LASS_HAVE_LONG_DOUBLE_STD_FUNCTIONS
466long double abs(
long double x) { return ::fabsl(x); }
467long double inv(
long double x) {
return 1. / x; }
468long double sqrt(
long double x) { LASS_ASSERT(!(x < 0.)); return ::sqrtl(x); }
469long double pow(
long double x,
long double p) { return ::powl(x, p); }
470long double exp(
long double x) { return ::expl(x); }
471long double log(
long double x) { return ::logl(x); }
472long double log2(
long double x) {
return (
long double)(LASS_NUM_INVLOG2) * ::logl(x); }
473long double log10(
long double x) { return ::log10l(x); }
474long double cos(
long double x) { return ::cosl(x); }
475long double sin(
long double x) { return ::sinl(x); }
476long double tan(
long double x) { return ::tanl(x); }
477long double acos(
long double x) { return ::acosl(x); }
478long double asin(
long double x) { return ::asinl(x); }
479long double atan(
long double x) { return ::atanl(x); }
480long double atan2(
long double y,
long double x) { return ::atan2l(y, x); }
481long double floor(
long double x) { return ::floorl(x); }
482long double ceil(
long double x) { return ::ceill(x); }
483long double round(
long double x) { return ::floorl(x + .5); }
484long double fractional(
long double x) {
return x - ::floorl(x); }
486#if LASS_COMPILER_TYPE == LASS_COMPILER_TYPE_MSVC
487# pragma warning(push)
488# pragma warning(disable: 4723)
490long double sinc(
long double x) { return ::fabsl(x) < 1e-10 ? 1. : (::sinl(x) / x); }
491#if LASS_COMPILER_TYPE == LASS_COMPILER_TYPE_MSVC
496long double mod(
long double x,
long double m)
498 const long double result = ::fmodl(x, m);
499 return result < 0. ? result + m : result;
504#if LASS_HAVE_LONG_DOUBLE
507long double fastSin(
long double x)
509 const long double a = 1.2732395447351628;
510 const long double b = -0.4052847345693511;
511 const long double c = 0.2248391028;
512 const long double y = a * x + b * x * num::abs(x);
513 return c * (y * num::abs(y) - y) + y;
517long double expm1(
long double x)
519 if (num::abs(x) < 1e-10)
521 return x + .5 * x * x;
523 return num::exp(x) - 1;
527long double log1p(
long double x)
529 if (num::abs(x) < 1e-10)
531 return x - .5f * x * x;
533 return num::log(1 + x);
541#ifdef LASS_CHAR_IS_SIGNED
543char pow(
char x,
char p) {
return impl::IntPow<char>::eval(x,
static_cast<signed char>(p)); }
544char pow(
char x,
unsigned char p) {
return impl::IntPow<char>::eval(x, p); }
545char div(
char x,
char m) {
return impl::IntDiv<char>::eval(x,
static_cast<signed char>(m)); }
546char div(
char x,
unsigned char m) {
return impl::IntDiv<char>::eval(x, m); }
547char mod(
char x,
char m) {
return impl::IntMod<char>::eval(x,
static_cast<signed char>(m)); }
548unsigned char mod(
char x,
unsigned char m) {
return impl::IntMod<char>::eval(x, m); }
552char abs(
char x) {
return x; }
553char sign(
char x) {
return x > 0 ? 1 : 0; }
554char pow(
char x,
char p) {
return impl::IntPow<char>::eval(x,
static_cast<unsigned char>(p)); }
555char div(
char x,
char p) {
return x / p; }
556char mod(
char x,
char p) {
return x % p; }
560char floor(
char x) {
return x; }
561char ceil(
char x) {
return x; }
562char round(
char x) {
return x; }
563char fractional(
char ) {
return 0; }
565void inpfloor(
char& ) {}
566void inpceil(
char& ) {}
567void inpround(
char& ) {}
568void inpfractional(
char& x) { x = 0; }
572signed char abs(
signed char x) {
return static_cast<signed char>(
::abs(x)); }
573signed char pow(
signed char x,
signed char p) {
return impl::IntPow<signed char>::eval(x, p); }
574signed char pow(
signed char x,
unsigned char p) {
return impl::IntPow<signed char>::eval(x, p); }
575signed char floor(
signed char x) {
return x; }
576signed char ceil(
signed char x) {
return x; }
577signed char round(
signed char x) {
return x; }
578signed char fractional(
signed char ) {
return 0; }
579signed char div(
signed char x,
signed char p) {
return impl::IntDiv<signed char>::eval(x, p); }
580signed char div(
signed char x,
unsigned char p) {
return impl::IntDiv<signed char>::eval(x, p); }
581signed char mod(
signed char x,
signed char p) {
return impl::IntMod<signed char>::eval(x, p); }
582unsigned char mod(
signed char x,
unsigned char p) {
return impl::IntMod<signed char>::eval(x, p); }
584void inpfloor(
signed char& ) {}
585void inpceil(
signed char& ) {}
586void inpround(
signed char& ) {}
587void inpfractional(
signed char& x) { x = 0; }
593unsigned char abs(
unsigned char x) {
return x; }
594unsigned char sign(
unsigned char x) {
return x > 0 ? 1 : 0; }
595unsigned char pow(
unsigned char x,
unsigned char p) {
return impl::IntPow<unsigned char>::eval(x, p); }
596unsigned char floor(
unsigned char x) {
return x; }
597unsigned char ceil(
unsigned char x) {
return x; }
598unsigned char round(
unsigned char x) {
return x; }
599unsigned char fractional(
unsigned char ) {
return 0; }
600unsigned char div(
unsigned char x,
unsigned char p) {
return x / p; }
601unsigned char mod(
unsigned char x,
unsigned char p) {
return x % p; }
603void inpabs(
unsigned char& ) {}
604void inpfloor(
unsigned char& ) {}
605void inpceil(
unsigned char& ) {}
606void inpround(
unsigned char& ) {}
607void inpfractional(
unsigned char& x) { x = 0; }
613signed short abs(
signed short x) {
return static_cast<signed short>(
::abs(x)); }
614signed short pow(
signed short x,
signed short p) {
return impl::IntPow<short>::eval(x, p); }
615signed short pow(
signed short x,
unsigned short p) {
return impl::IntPow<short>::eval(x, p); }
616signed short floor(
signed short x) {
return x; }
617signed short ceil(
signed short x) {
return x; }
618signed short round(
signed short x) {
return x; }
619signed short fractional(
signed short ) {
return 0; }
620signed short div(
signed short x,
signed short p) {
return impl::IntDiv<short>::eval(x, p); }
621signed short div(
signed short x,
unsigned short p) {
return impl::IntDiv<short>::eval(x, p); }
622signed short mod(
signed short x,
signed short p) {
return impl::IntMod<short>::eval(x, p); }
623unsigned short mod(
signed short x,
unsigned short p) {
return impl::IntMod<short>::eval(x, p); }
625void inpfloor(
signed short& ) {}
626void inpceil(
signed short& ) {}
627void inpround(
signed short& ) {}
628void inpfractional(
signed short& x) { x = 0; }
634unsigned short abs(
unsigned short x) {
return x; }
635unsigned short sign(
unsigned short x) {
return x > 0 ? 1 : 0; }
636unsigned short pow(
unsigned short x,
unsigned short p) {
return impl::IntPow<unsigned short>::eval(x, p); }
637unsigned short floor(
unsigned short x) {
return x; }
638unsigned short ceil(
unsigned short x) {
return x; }
639unsigned short round(
unsigned short x) {
return x; }
640unsigned short fractional(
unsigned short ) {
return 0; }
641unsigned short div(
unsigned short x,
unsigned short p) {
return x / p; }
642unsigned short mod(
unsigned short x,
unsigned short p) {
return x % p; }
644void inpabs(
unsigned short& ) {}
645void inpfloor(
unsigned short& ) {}
646void inpceil(
unsigned short& ) {}
647void inpround(
unsigned short& ) {}
648void inpfractional(
unsigned short& x) { x = 0; }
654signed int abs(
signed int x) { return ::abs(x); }
655signed int pow(
signed int x,
signed int p) {
return impl::IntPow<int>::eval(x, p); }
656signed int pow(
signed int x,
unsigned int p) {
return impl::IntPow<int>::eval(x, p); }
657signed int floor(
signed int x) {
return x; }
658signed int ceil(
signed int x) {
return x; }
659signed int round(
signed int x) {
return x; }
660signed int fractional(
signed int ) {
return 0; }
661signed int div(
signed int x,
signed int p) {
return impl::IntDiv<int>::eval(x, p); }
662signed int div(
signed int x,
unsigned int p) {
return impl::IntDiv<int>::eval(x, p); }
663signed int mod(
signed int x,
signed int p) {
return impl::IntMod<int>::eval(x, p); }
664unsigned int mod(
signed int x,
unsigned int p) {
return impl::IntMod<int>::eval(x, p); }
666void inpfloor(
signed int& ) {}
667void inpceil(
signed int& ) {}
668void inpround(
signed int& ) {}
669void inpfractional(
signed int& x) { x = 0; }
675unsigned int abs(
unsigned int x) {
return x; }
676unsigned int sign(
unsigned int x) {
return x > 0 ? 1 : 0; }
677unsigned int pow(
unsigned int x,
unsigned int p) {
return impl::IntPow<unsigned int>::eval(x, p); }
678unsigned int floor(
unsigned int x) {
return x; }
679unsigned int ceil(
unsigned int x) {
return x; }
680unsigned int round(
unsigned int x) {
return x; }
681unsigned int fractional(
unsigned int ) {
return 0; }
682unsigned int div(
unsigned int x,
unsigned int p) {
return x / p; }
683unsigned int mod(
unsigned int x,
unsigned int p) {
return x % p; }
685void inpabs(
unsigned int& ) {}
686void inpfloor(
unsigned int& ) {}
687void inpceil(
unsigned int& ) {}
688void inpround(
unsigned int& ) {}
689void inpfractional(
unsigned int& x) { x = 0; }
695signed long abs(
signed long x) { return ::labs(x); }
696signed long pow(
signed long x,
signed long p) {
return impl::IntPow<long>::eval(x, p); }
697signed long pow(
signed long x,
unsigned long p) {
return impl::IntPow<long>::eval(x, p); }
698signed long floor(
signed long x) {
return x; }
699signed long ceil(
signed long x) {
return x; }
700signed long round(
signed long x) {
return x; }
701signed long fractional(
signed long ) {
return 0; }
702signed long div(
signed long x,
signed long p) {
return impl::IntDiv<long>::eval(x, p); }
703signed long div(
signed long x,
unsigned long p) {
return impl::IntDiv<long>::eval(x, p); }
704signed long mod(
signed long x,
signed long p) {
return impl::IntMod<long>::eval(x, p); }
705unsigned long mod(
signed long x,
unsigned long p) {
return impl::IntMod<long>::eval(x, p); }
707void inpfloor(
signed long& ) {}
708void inpceil(
signed long& ) {}
709void inpround(
signed long& ) {}
710void inpfractional(
signed long& x) { x = 0; }
716unsigned long abs(
unsigned long x) {
return x; }
717unsigned long sign(
unsigned long x) {
return x > 0 ? 1 : 0; }
718unsigned long pow(
unsigned long x,
unsigned long p) {
return impl::IntPow<unsigned long>::eval(x, p); }
719unsigned long floor(
unsigned long x) {
return x; }
720unsigned long ceil(
unsigned long x) {
return x; }
721unsigned long round(
unsigned long x) {
return x; }
722unsigned long fractional(
unsigned long ) {
return 0; }
723unsigned long div(
unsigned long x,
unsigned long p) {
return x / p; }
724unsigned long mod(
unsigned long x,
unsigned long p) {
return x % p; }
726void inpabs(
unsigned long& ) {}
727void inpfloor(
unsigned long& ) {}
728void inpceil(
unsigned long& ) {}
729void inpround(
unsigned long& ) {}
730void inpfractional(
unsigned long& x) { x = 0; }
734#if LASS_HAVE_LONG_LONG
739signed long long abs(
signed long long x)
749signed long long pow(
signed long long x,
signed long long p) {
return impl::IntPow<long long>::eval(x, p); }
750signed long long pow(
signed long long x,
unsigned long long p) {
return impl::IntPow<long long>::eval(x, p); }
751signed long long floor(
signed long long x) {
return x; }
752signed long long ceil(
signed long long x) {
return x; }
753signed long long round(
signed long long x) {
return x; }
754signed long long fractional(
signed long long ) {
return 0; }
755signed long long div(
signed long long x,
signed long long p) {
return impl::IntDiv<long long>::eval(x, p); }
756signed long long div(
signed long long x,
unsigned long long p) {
return impl::IntDiv<long long>::eval(x, p); }
757signed long long mod(
signed long long x,
signed long long p) {
return impl::IntMod<long long>::eval(x, p); }
758unsigned long long mod(
signed long long x,
unsigned long long p) {
return impl::IntMod<long long>::eval(x, p); }
760void inpfloor(
signed long long& ) {}
761void inpceil(
signed long long& ) {}
762void inpround(
signed long long& ) {}
763void inpfractional(
signed long long& x) { x = 0; }
769unsigned long long abs(
unsigned long long x) {
return x; }
770unsigned long long sign(
unsigned long long x) {
return x > 0 ? 1 : 0; }
771unsigned long long pow(
unsigned long long x,
unsigned long long p) {
return impl::IntPow<unsigned long long>::eval(x, p); }
772unsigned long long floor(
unsigned long long x) {
return x; }
773unsigned long long ceil(
unsigned long long x) {
return x; }
774unsigned long long round(
unsigned long long x) {
return x; }
775unsigned long long fractional(
unsigned long long ) {
return 0; }
776unsigned long long div(
unsigned long long x,
unsigned long long p) {
return x / p; }
777unsigned long long mod(
unsigned long long x,
unsigned long long p) {
return x % p; }
779void inpabs(
unsigned long long& ) {}
780void inpfloor(
unsigned long long& ) {}
781void inpceil(
unsigned long long& ) {}
782void inpround(
unsigned long long& ) {}
783void inpfractional(
unsigned long long& x) { x = 0; }
792template <
typename T> T
abs(
const std::complex<T>& x) {
return std::abs( x ); }
793template <
typename T> std::complex<T>
inv(
const std::complex<T>& x) {
return T(1)/x; }
794template <
typename T> std::complex<T> sqrt(
const std::complex<T>& x){
return std::sqrt( x ); }
795template <
typename T> std::complex<T>
pow(
const std::complex<T>& x,
double p) {
return std::pow(x, p); }
796template <
typename T> std::complex<T> exp(
const std::complex<T>& x) {
return std::exp( x ); }
797template <
typename T> std::complex<T> log(
const std::complex<T>& x) {
return std::log( x ); }
798template <
typename T> std::complex<T>
log2(
const std::complex<T>& x) {
return T(LASS_NUM_INVLOG2) * std::log( x ); }
799template <
typename T> std::complex<T>
log10(
const std::complex<T>& x) {
return T(LASS_NUM_INVLOG10) * std::log( x ); }
800template <
typename T> std::complex<T> cos(
const std::complex<T>& x) {
return std::cos( x ); }
801template <
typename T> std::complex<T> sin(
const std::complex<T>& x) {
return std::sin( x ); }
802template <
typename T> std::complex<T> tan(
const std::complex<T>& x) {
return std::tan( x ); }
803template <
typename T> std::complex<T> acos(
const std::complex<T>& x){
return std::acos( x ); }
804template <
typename T> std::complex<T> asin(
const std::complex<T>& x){
return std::asin( x ); }
805template <
typename T> std::complex<T> atan(
const std::complex<T>& x){
return std::atan( x ); }
807template <
typename T> T
norm(
const std::complex<T>& x) {
return std::norm( x ); }
808template <
typename T> std::complex<T>
conj(
const std::complex<T>& x) {
return std::conj(x); }
T conj(const T &x)
return conjugate as if x is a complex number: x
T pow(const T &x, const T &p)
return exp(p * log(x));
T log2(const T &x)
return log(x) / log(2)
T norm(const T &x)
return norm of x as if x is real part of complex number: sqr(x)
T abs(const T &x)
if x < 0 return -x, else return x.
T inv(const T &x)
return x ^ -1
T sqr(const T &x)
return x * x
T lerp(const T &a, const T &b, const T &f)
linear interpolation between a and b
T log10(const T &x)
return log(x) / log(10)
const T & clamp(const T &x, const T &min, const T &max)
if x < min return min, else if x > max return max, else return x.
T sign(const T &x)
if x < 0 return -1, else if x > 0 return 1, else return 0.
T cubic(const T &x)
return x * x * x