10#ifndef EIGEN_MATHFUNCTIONS_H
11#define EIGEN_MATHFUNCTIONS_H
15#define EIGEN_PI 3.141592653589793238462643383279502884197169399375105820974944592307816406L
22#if EIGEN_OS_WINCE && EIGEN_COMP_MSVC && EIGEN_COMP_MSVC<=1500
23long abs(
long x) {
return (labs(x)); }
24double abs(
double x) {
return (fabs(x)); }
25float abs(
float x) {
return (fabsf(x)); }
26long double abs(
long double x) {
return (fabsl(x)); }
51template<
typename T,
typename dummy =
void>
52struct global_math_functions_filtering_base
57template<
typename T>
struct always_void {
typedef void type; };
60struct global_math_functions_filtering_base
62 typename always_void<typename T::Eigen_BaseClassForSpecializationOfGlobalMathFuncImpl>::type
65 typedef typename T::Eigen_BaseClassForSpecializationOfGlobalMathFuncImpl type;
68#define EIGEN_MATHFUNC_IMPL(func, scalar) Eigen::internal::func##_impl<typename Eigen::internal::global_math_functions_filtering_base<scalar>::type>
69#define EIGEN_MATHFUNC_RETVAL(func, scalar) typename Eigen::internal::func##_retval<typename Eigen::internal::global_math_functions_filtering_base<scalar>::type>::type
75template<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
76struct real_default_impl
78 typedef typename NumTraits<Scalar>::Real RealScalar;
80 static inline RealScalar run(
const Scalar& x)
86template<
typename Scalar>
87struct real_default_impl<Scalar,true>
89 typedef typename NumTraits<Scalar>::Real RealScalar;
91 static inline RealScalar run(
const Scalar& x)
98template<
typename Scalar>
struct real_impl : real_default_impl<Scalar> {};
102struct real_impl<std::complex<T> >
104 typedef T RealScalar;
106 static inline T run(
const std::complex<T>& x)
113template<
typename Scalar>
116 typedef typename NumTraits<Scalar>::Real type;
123template<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
124struct imag_default_impl
126 typedef typename NumTraits<Scalar>::Real RealScalar;
128 static inline RealScalar run(
const Scalar&)
130 return RealScalar(0);
134template<
typename Scalar>
135struct imag_default_impl<Scalar,true>
137 typedef typename NumTraits<Scalar>::Real RealScalar;
139 static inline RealScalar run(
const Scalar& x)
146template<
typename Scalar>
struct imag_impl : imag_default_impl<Scalar> {};
150struct imag_impl<std::complex<T> >
152 typedef T RealScalar;
154 static inline T run(
const std::complex<T>& x)
161template<
typename Scalar>
164 typedef typename NumTraits<Scalar>::Real type;
171template<
typename Scalar>
174 typedef typename NumTraits<Scalar>::Real RealScalar;
176 static inline RealScalar& run(Scalar& x)
178 return reinterpret_cast<RealScalar*
>(&x)[0];
181 static inline const RealScalar& run(
const Scalar& x)
183 return reinterpret_cast<const RealScalar*
>(&x)[0];
187template<
typename Scalar>
188struct real_ref_retval
190 typedef typename NumTraits<Scalar>::Real & type;
197template<
typename Scalar,
bool IsComplex>
198struct imag_ref_default_impl
200 typedef typename NumTraits<Scalar>::Real RealScalar;
202 static inline RealScalar& run(Scalar& x)
204 return reinterpret_cast<RealScalar*
>(&x)[1];
207 static inline const RealScalar& run(
const Scalar& x)
209 return reinterpret_cast<RealScalar*
>(&x)[1];
213template<
typename Scalar>
214struct imag_ref_default_impl<Scalar, false>
217 static inline Scalar run(Scalar&)
222 static inline const Scalar run(
const Scalar&)
228template<
typename Scalar>
229struct imag_ref_impl : imag_ref_default_impl<Scalar, NumTraits<Scalar>::IsComplex> {};
231template<
typename Scalar>
232struct imag_ref_retval
234 typedef typename NumTraits<Scalar>::Real & type;
241template<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
245 static inline Scalar run(
const Scalar& x)
251template<
typename Scalar>
252struct conj_impl<Scalar,true>
255 static inline Scalar run(
const Scalar& x)
262template<
typename Scalar>
272template<
typename Scalar,
bool IsComplex>
273struct abs2_impl_default
275 typedef typename NumTraits<Scalar>::Real RealScalar;
277 static inline RealScalar run(
const Scalar& x)
283template<
typename Scalar>
284struct abs2_impl_default<Scalar, true>
286 typedef typename NumTraits<Scalar>::Real RealScalar;
288 static inline RealScalar run(
const Scalar& x)
294template<
typename Scalar>
297 typedef typename NumTraits<Scalar>::Real RealScalar;
299 static inline RealScalar run(
const Scalar& x)
301 return abs2_impl_default<Scalar,NumTraits<Scalar>::IsComplex>::run(x);
305template<
typename Scalar>
308 typedef typename NumTraits<Scalar>::Real type;
315template<
typename Scalar,
bool IsComplex>
316struct norm1_default_impl
318 typedef typename NumTraits<Scalar>::Real RealScalar;
320 static inline RealScalar run(
const Scalar& x)
322 EIGEN_USING_STD_MATH(abs);
327template<
typename Scalar>
328struct norm1_default_impl<Scalar, false>
331 static inline Scalar run(
const Scalar& x)
333 EIGEN_USING_STD_MATH(abs);
338template<
typename Scalar>
339struct norm1_impl : norm1_default_impl<Scalar, NumTraits<Scalar>::IsComplex> {};
341template<
typename Scalar>
344 typedef typename NumTraits<Scalar>::Real type;
351template<
typename Scalar>
354 typedef typename NumTraits<Scalar>::Real RealScalar;
355 static inline RealScalar run(
const Scalar& x,
const Scalar& y)
357 EIGEN_USING_STD_MATH(abs);
358 EIGEN_USING_STD_MATH(sqrt);
359 RealScalar _x = abs(x);
360 RealScalar _y = abs(y);
372 if(p==RealScalar(0))
return RealScalar(0);
373 return p * sqrt(RealScalar(1) + qp*qp);
377template<
typename Scalar>
380 typedef typename NumTraits<Scalar>::Real type;
387template<
typename OldType,
typename NewType>
391 static inline NewType run(
const OldType& x)
393 return static_cast<NewType
>(x);
399template<
typename OldType,
typename NewType>
401inline NewType cast(
const OldType& x)
403 return cast_impl<OldType, NewType>::run(x);
410#if EIGEN_HAS_CXX11_MATH
411 template<
typename Scalar>
413 static inline Scalar run(
const Scalar& x)
415 EIGEN_STATIC_ASSERT((!NumTraits<Scalar>::IsComplex), NUMERIC_TYPE_MUST_BE_REAL)
421 template<
typename Scalar>
424 static inline Scalar run(
const Scalar& x)
426 EIGEN_STATIC_ASSERT((!NumTraits<Scalar>::IsComplex), NUMERIC_TYPE_MUST_BE_REAL)
427 EIGEN_USING_STD_MATH(floor);
428 EIGEN_USING_STD_MATH(ceil);
429 return (x > Scalar(0)) ? floor(x + Scalar(0.5)) : ceil(x - Scalar(0.5));
434template<
typename Scalar>
444#if EIGEN_HAS_CXX11_MATH
445 template<
typename Scalar>
447 static inline Scalar run(
const Scalar& x)
449 EIGEN_USING_STD_MATH(arg);
454 template<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
455 struct arg_default_impl
457 typedef typename NumTraits<Scalar>::Real RealScalar;
459 static inline RealScalar run(
const Scalar& x)
461 return (x < Scalar(0)) ? Scalar(EIGEN_PI) : Scalar(0); }
464 template<
typename Scalar>
465 struct arg_default_impl<Scalar,true>
467 typedef typename NumTraits<Scalar>::Real RealScalar;
469 static inline RealScalar run(
const Scalar& x)
471 EIGEN_USING_STD_MATH(arg);
476 template<
typename Scalar>
struct arg_impl : arg_default_impl<Scalar> {};
479template<
typename Scalar>
482 typedef typename NumTraits<Scalar>::Real type;
489namespace std_fallback {
492 template<
typename Scalar>
493 EIGEN_DEVICE_FUNC
inline Scalar log1p(
const Scalar& x) {
494 EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
495 typedef typename NumTraits<Scalar>::Real RealScalar;
496 EIGEN_USING_STD_MATH(log);
497 Scalar x1p = RealScalar(1) + x;
498 return ( x1p == Scalar(1) ) ? x : x * ( log(x1p) / (x1p - RealScalar(1)) );
502template<
typename Scalar>
504 static inline Scalar run(
const Scalar& x)
506 EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
507 #if EIGEN_HAS_CXX11_MATH
510 using std_fallback::log1p;
516template<
typename Scalar>
526template<typename ScalarX,typename ScalarY, bool IsInteger = NumTraits<ScalarX>::IsInteger&&NumTraits<ScalarY>::IsInteger>
530 typedef typename ScalarBinaryOpTraits<ScalarX,ScalarY,internal::scalar_pow_op<ScalarX,ScalarY> >::ReturnType result_type;
531 static EIGEN_DEVICE_FUNC
inline result_type run(
const ScalarX& x,
const ScalarY& y)
533 EIGEN_USING_STD_MATH(pow);
538template<
typename ScalarX,
typename ScalarY>
539struct pow_impl<ScalarX,ScalarY, true>
541 typedef ScalarX result_type;
542 static EIGEN_DEVICE_FUNC
inline ScalarX run(ScalarX x, ScalarY y)
545 eigen_assert(!NumTraits<ScalarY>::IsSigned || y >= 0);
562template<
typename Scalar,
565struct random_default_impl {};
567template<
typename Scalar>
568struct random_impl : random_default_impl<Scalar, NumTraits<Scalar>::IsComplex, NumTraits<Scalar>::IsInteger> {};
570template<
typename Scalar>
576template<
typename Scalar>
inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random(
const Scalar& x,
const Scalar& y);
577template<
typename Scalar>
inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random();
579template<
typename Scalar>
580struct random_default_impl<Scalar, false, false>
582 static inline Scalar run(
const Scalar& x,
const Scalar& y)
584 return x + (y-x) * Scalar(std::rand()) / Scalar(RAND_MAX);
586 static inline Scalar run()
588 return run(Scalar(NumTraits<Scalar>::IsSigned ? -1 : 0), Scalar(1));
593 meta_floor_log2_terminate,
594 meta_floor_log2_move_up,
595 meta_floor_log2_move_down,
596 meta_floor_log2_bogus
599template<
unsigned int n,
int lower,
int upper>
struct meta_floor_log2_selector
601 enum { middle = (lower + upper) / 2,
602 value = (upper <= lower + 1) ? int(meta_floor_log2_terminate)
603 : (n < (1 << middle)) ? int(meta_floor_log2_move_down)
604 : (n==0) ? int(meta_floor_log2_bogus)
605 : int(meta_floor_log2_move_up)
609template<
unsigned int n,
611 int upper =
sizeof(
unsigned int) * CHAR_BIT - 1,
612 int selector = meta_floor_log2_selector<n, lower, upper>::value>
613struct meta_floor_log2 {};
615template<
unsigned int n,
int lower,
int upper>
616struct meta_floor_log2<n, lower, upper, meta_floor_log2_move_down>
618 enum { value = meta_floor_log2<n, lower, meta_floor_log2_selector<n, lower, upper>::middle>::value };
621template<
unsigned int n,
int lower,
int upper>
622struct meta_floor_log2<n, lower, upper, meta_floor_log2_move_up>
624 enum { value = meta_floor_log2<n, meta_floor_log2_selector<n, lower, upper>::middle, upper>::value };
627template<
unsigned int n,
int lower,
int upper>
628struct meta_floor_log2<n, lower, upper, meta_floor_log2_terminate>
630 enum { value = (n >= ((
unsigned int)(1) << (lower+1))) ? lower+1 : lower };
633template<
unsigned int n,
int lower,
int upper>
634struct meta_floor_log2<n, lower, upper, meta_floor_log2_bogus>
639template<
typename Scalar>
640struct random_default_impl<Scalar, false, true>
642 static inline Scalar run(
const Scalar& x,
const Scalar& y)
644 typedef typename conditional<NumTraits<Scalar>::IsSigned,std::ptrdiff_t,std::size_t>::type ScalarX;
649 std::size_t range = ScalarX(y)-ScalarX(x);
650 std::size_t offset = 0;
652 std::size_t divisor = 1;
653 std::size_t multiplier = 1;
654 if(range<RAND_MAX) divisor = (std::size_t(RAND_MAX)+1)/(range+1);
655 else multiplier = 1 + range/(std::size_t(RAND_MAX)+1);
657 offset = (std::size_t(std::rand()) * multiplier) / divisor;
658 }
while (offset > range);
659 return Scalar(ScalarX(x) + offset);
662 static inline Scalar run()
664#ifdef EIGEN_MAKING_DOCS
665 return run(Scalar(NumTraits<Scalar>::IsSigned ? -10 : 0), Scalar(10));
667 enum { rand_bits = meta_floor_log2<(
unsigned int)(RAND_MAX)+1>::value,
668 scalar_bits =
sizeof(Scalar) * CHAR_BIT,
669 shift = EIGEN_PLAIN_ENUM_MAX(0,
int(rand_bits) - int(scalar_bits)),
670 offset = NumTraits<Scalar>::IsSigned ? (1 << (EIGEN_PLAIN_ENUM_MIN(rand_bits,scalar_bits)-1)) : 0
672 return Scalar((std::rand() >> shift) - offset);
677template<
typename Scalar>
678struct random_default_impl<Scalar, true, false>
680 static inline Scalar run(
const Scalar& x,
const Scalar& y)
682 return Scalar(random(
real(x),
real(y)),
685 static inline Scalar run()
687 typedef typename NumTraits<Scalar>::Real RealScalar;
688 return Scalar(random<RealScalar>(), random<RealScalar>());
692template<
typename Scalar>
693inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random(
const Scalar& x,
const Scalar& y)
695 return EIGEN_MATHFUNC_IMPL(random, Scalar)::run(x, y);
698template<
typename Scalar>
699inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random()
701 return EIGEN_MATHFUNC_IMPL(random, Scalar)::run();
707#if (EIGEN_HAS_CXX11_MATH && !(EIGEN_COMP_GNUC_STRICT && __FINITE_MATH_ONLY__)) || (EIGEN_COMP_MSVC>=1800) || (EIGEN_COMP_CLANG)
708#define EIGEN_USE_STD_FPCLASSIFY 1
710#define EIGEN_USE_STD_FPCLASSIFY 0
715typename internal::enable_if<internal::is_integral<T>::value,
bool>::type
716isnan_impl(
const T&) {
return false; }
720typename internal::enable_if<internal::is_integral<T>::value,
bool>::type
721isinf_impl(
const T&) {
return false; }
725typename internal::enable_if<internal::is_integral<T>::value,
bool>::type
726isfinite_impl(
const T&) {
return true; }
730typename internal::enable_if<(!internal::is_integral<T>::value)&&(!NumTraits<T>::IsComplex),
bool>::type
731isfinite_impl(
const T& x)
734 return (::isfinite)(x);
735 #elif EIGEN_USE_STD_FPCLASSIFY
737 return isfinite EIGEN_NOT_A_MACRO (x);
739 return x<=NumTraits<T>::highest() && x>=NumTraits<T>::lowest();
745typename internal::enable_if<(!internal::is_integral<T>::value)&&(!NumTraits<T>::IsComplex),
bool>::type
746isinf_impl(
const T& x)
750 #elif EIGEN_USE_STD_FPCLASSIFY
752 return isinf EIGEN_NOT_A_MACRO (x);
754 return x>NumTraits<T>::highest() || x<NumTraits<T>::lowest();
760typename internal::enable_if<(!internal::is_integral<T>::value)&&(!NumTraits<T>::IsComplex),
bool>::type
761isnan_impl(
const T& x)
765 #elif EIGEN_USE_STD_FPCLASSIFY
767 return isnan EIGEN_NOT_A_MACRO (x);
773#if (!EIGEN_USE_STD_FPCLASSIFY)
777template<
typename T> EIGEN_DEVICE_FUNC
bool isinf_msvc_helper(T x)
779 return _fpclass(x)==_FPCLASS_NINF || _fpclass(x)==_FPCLASS_PINF;
783EIGEN_DEVICE_FUNC
inline bool isnan_impl(
const long double& x) {
return _isnan(x)!=0; }
784EIGEN_DEVICE_FUNC
inline bool isnan_impl(
const double& x) {
return _isnan(x)!=0; }
785EIGEN_DEVICE_FUNC
inline bool isnan_impl(
const float& x) {
return _isnan(x)!=0; }
787EIGEN_DEVICE_FUNC
inline bool isinf_impl(
const long double& x) {
return isinf_msvc_helper(x); }
788EIGEN_DEVICE_FUNC
inline bool isinf_impl(
const double& x) {
return isinf_msvc_helper(x); }
789EIGEN_DEVICE_FUNC
inline bool isinf_impl(
const float& x) {
return isinf_msvc_helper(x); }
791#elif (defined __FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ && EIGEN_COMP_GNUC)
793#if EIGEN_GNUC_AT_LEAST(5,0)
794 #define EIGEN_TMP_NOOPT_ATTRIB EIGEN_DEVICE_FUNC inline __attribute__((optimize("no-finite-math-only")))
798 #define EIGEN_TMP_NOOPT_ATTRIB EIGEN_DEVICE_FUNC inline __attribute__((noinline,optimize("no-finite-math-only")))
801template<> EIGEN_TMP_NOOPT_ATTRIB
bool isnan_impl(
const long double& x) {
return __builtin_isnan(x); }
802template<> EIGEN_TMP_NOOPT_ATTRIB
bool isnan_impl(
const double& x) {
return __builtin_isnan(x); }
803template<> EIGEN_TMP_NOOPT_ATTRIB
bool isnan_impl(
const float& x) {
return __builtin_isnan(x); }
804template<> EIGEN_TMP_NOOPT_ATTRIB
bool isinf_impl(
const double& x) {
return __builtin_isinf(x); }
805template<> EIGEN_TMP_NOOPT_ATTRIB
bool isinf_impl(
const float& x) {
return __builtin_isinf(x); }
806template<> EIGEN_TMP_NOOPT_ATTRIB
bool isinf_impl(
const long double& x) {
return __builtin_isinf(x); }
808#undef EIGEN_TMP_NOOPT_ATTRIB
815template<
typename T> EIGEN_DEVICE_FUNC
bool isfinite_impl(
const std::complex<T>& x);
816template<
typename T> EIGEN_DEVICE_FUNC
bool isnan_impl(
const std::complex<T>& x);
817template<
typename T> EIGEN_DEVICE_FUNC
bool isinf_impl(
const std::complex<T>& x);
819template<
typename T> T generic_fast_tanh_float(
const T& a_x);
832EIGEN_ALWAYS_INLINE T mini(
const T& x,
const T& y)
834 EIGEN_USING_STD_MATH(min);
835 return min EIGEN_NOT_A_MACRO (x,y);
840EIGEN_ALWAYS_INLINE T maxi(
const T& x,
const T& y)
842 EIGEN_USING_STD_MATH(max);
843 return max EIGEN_NOT_A_MACRO (x,y);
848EIGEN_ALWAYS_INLINE T mini(
const T& x,
const T& y)
850 return y < x ? y : x;
854EIGEN_ALWAYS_INLINE
float mini(
const float& x,
const float& y)
860EIGEN_ALWAYS_INLINE T maxi(
const T& x,
const T& y)
862 return x < y ? y : x;
866EIGEN_ALWAYS_INLINE
float maxi(
const float& x,
const float& y)
873template<
typename Scalar>
875inline EIGEN_MATHFUNC_RETVAL(real, Scalar)
real(
const Scalar& x)
877 return EIGEN_MATHFUNC_IMPL(real, Scalar)::run(x);
880template<
typename Scalar>
882inline typename internal::add_const_on_value_type< EIGEN_MATHFUNC_RETVAL(real_ref, Scalar) >::type real_ref(
const Scalar& x)
884 return internal::real_ref_impl<Scalar>::run(x);
887template<
typename Scalar>
889inline EIGEN_MATHFUNC_RETVAL(real_ref, Scalar) real_ref(Scalar& x)
891 return EIGEN_MATHFUNC_IMPL(real_ref, Scalar)::run(x);
894template<
typename Scalar>
896inline EIGEN_MATHFUNC_RETVAL(imag, Scalar)
imag(
const Scalar& x)
898 return EIGEN_MATHFUNC_IMPL(imag, Scalar)::run(x);
901template<
typename Scalar>
903inline EIGEN_MATHFUNC_RETVAL(arg, Scalar)
arg(
const Scalar& x)
905 return EIGEN_MATHFUNC_IMPL(arg, Scalar)::run(x);
908template<
typename Scalar>
910inline typename internal::add_const_on_value_type< EIGEN_MATHFUNC_RETVAL(imag_ref, Scalar) >::type imag_ref(
const Scalar& x)
912 return internal::imag_ref_impl<Scalar>::run(x);
915template<
typename Scalar>
917inline EIGEN_MATHFUNC_RETVAL(imag_ref, Scalar) imag_ref(Scalar& x)
919 return EIGEN_MATHFUNC_IMPL(imag_ref, Scalar)::run(x);
922template<
typename Scalar>
924inline EIGEN_MATHFUNC_RETVAL(conj, Scalar)
conj(
const Scalar& x)
926 return EIGEN_MATHFUNC_IMPL(conj, Scalar)::run(x);
929template<
typename Scalar>
931inline EIGEN_MATHFUNC_RETVAL(abs2, Scalar)
abs2(
const Scalar& x)
933 return EIGEN_MATHFUNC_IMPL(abs2, Scalar)::run(x);
936template<
typename Scalar>
938inline EIGEN_MATHFUNC_RETVAL(norm1, Scalar) norm1(
const Scalar& x)
940 return EIGEN_MATHFUNC_IMPL(norm1, Scalar)::run(x);
943template<
typename Scalar>
945inline EIGEN_MATHFUNC_RETVAL(hypot, Scalar) hypot(
const Scalar& x,
const Scalar& y)
947 return EIGEN_MATHFUNC_IMPL(hypot, Scalar)::run(x, y);
950template<
typename Scalar>
952inline EIGEN_MATHFUNC_RETVAL(log1p, Scalar) log1p(
const Scalar& x)
954 return EIGEN_MATHFUNC_IMPL(log1p, Scalar)::run(x);
958template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
959float log1p(
const float &x) { return ::log1pf(x); }
961template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
962double log1p(
const double &x) { return ::log1p(x); }
965template<
typename ScalarX,
typename ScalarY>
967inline typename internal::pow_impl<ScalarX,ScalarY>::result_type pow(
const ScalarX& x,
const ScalarY& y)
969 return internal::pow_impl<ScalarX,ScalarY>::run(x, y);
972template<
typename T> EIGEN_DEVICE_FUNC bool (isnan) (
const T &x) {
return internal::isnan_impl(x); }
973template<
typename T> EIGEN_DEVICE_FUNC bool (isinf) (
const T &x) {
return internal::isinf_impl(x); }
974template<
typename T> EIGEN_DEVICE_FUNC bool (isfinite)(
const T &x) {
return internal::isfinite_impl(x); }
976template<
typename Scalar>
978inline EIGEN_MATHFUNC_RETVAL(round, Scalar)
round(
const Scalar& x)
980 return EIGEN_MATHFUNC_IMPL(round, Scalar)::run(x);
987 EIGEN_USING_STD_MATH(floor);
992template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
993float floor(
const float &x) { return ::floorf(x); }
995template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
996double floor(
const double &x) { return ::floor(x); }
1003 EIGEN_USING_STD_MATH(ceil);
1008template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1009float ceil(
const float &x) { return ::ceilf(x); }
1011template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1012double ceil(
const double &x) { return ::ceil(x); }
1018inline int log2(
int x)
1022 static const int table[32] = { 0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30, 8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31 };
1028 return table[(v * 0x07C4ACDDU) >> 27];
1040EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1043 EIGEN_USING_STD_MATH(sqrt);
1048EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1050 EIGEN_USING_STD_MATH(log);
1055template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1056float log(
const float &x) { return ::logf(x); }
1058template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1059double log(
const double &x) { return ::log(x); }
1063EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1064typename NumTraits<T>::Real abs(
const T &x) {
1065 EIGEN_USING_STD_MATH(abs);
1070template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1071float abs(
const float &x) { return ::fabsf(x); }
1073template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1074double abs(
const double &x) { return ::fabs(x); }
1076template <> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1077float abs(
const std::complex<float>& x) {
1078 return ::hypotf(x.real(), x.imag());
1081template <> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1082double abs(
const std::complex<double>& x) {
1083 return ::hypot(x.real(), x.imag());
1088EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1090 EIGEN_USING_STD_MATH(exp);
1095template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1096float exp(
const float &x) { return ::expf(x); }
1098template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1099double exp(
const double &x) { return ::exp(x); }
1103EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1105 EIGEN_USING_STD_MATH(cos);
1110template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1111float cos(
const float &x) { return ::cosf(x); }
1113template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1114double cos(
const double &x) { return ::cos(x); }
1118EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1120 EIGEN_USING_STD_MATH(sin);
1125template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1126float sin(
const float &x) { return ::sinf(x); }
1128template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1129double sin(
const double &x) { return ::sin(x); }
1133EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1135 EIGEN_USING_STD_MATH(tan);
1140template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1141float tan(
const float &x) { return ::tanf(x); }
1143template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1144double tan(
const double &x) { return ::tan(x); }
1148EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1150 EIGEN_USING_STD_MATH(acos);
1155template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1156float acos(
const float &x) { return ::acosf(x); }
1158template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1159double acos(
const double &x) { return ::acos(x); }
1163EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1165 EIGEN_USING_STD_MATH(asin);
1170template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1171float asin(
const float &x) { return ::asinf(x); }
1173template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1174double asin(
const double &x) { return ::asin(x); }
1178EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1180 EIGEN_USING_STD_MATH(atan);
1185template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1186float atan(
const float &x) { return ::atanf(x); }
1188template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1189double atan(
const double &x) { return ::atan(x); }
1194EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1196 EIGEN_USING_STD_MATH(cosh);
1201template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1202float cosh(
const float &x) { return ::coshf(x); }
1204template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1205double cosh(
const double &x) { return ::cosh(x); }
1209EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1211 EIGEN_USING_STD_MATH(sinh);
1216template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1217float sinh(
const float &x) { return ::sinhf(x); }
1219template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1220double sinh(
const double &x) { return ::sinh(x); }
1224EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1226 EIGEN_USING_STD_MATH(tanh);
1230#if (!defined(__CUDACC__)) && EIGEN_FAST_MATH
1231EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1232float tanh(
float x) {
return internal::generic_fast_tanh_float(x); }
1236template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1237float tanh(
const float &x) { return ::tanhf(x); }
1239template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1240double tanh(
const double &x) { return ::tanh(x); }
1243template <
typename T>
1244EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1245T fmod(
const T& a,
const T& b) {
1246 EIGEN_USING_STD_MATH(fmod);
1252EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1253float fmod(
const float& a,
const float& b) {
1254 return ::fmodf(a, b);
1258EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1259double fmod(
const double& a,
const double& b) {
1260 return ::fmod(a, b);
1269EIGEN_DEVICE_FUNC
bool isfinite_impl(
const std::complex<T>& x)
1271 return (numext::isfinite)(numext::real(x)) && (numext::isfinite)(numext::imag(x));
1275EIGEN_DEVICE_FUNC
bool isnan_impl(
const std::complex<T>& x)
1277 return (numext::isnan)(numext::real(x)) || (numext::isnan)(numext::imag(x));
1281EIGEN_DEVICE_FUNC
bool isinf_impl(
const std::complex<T>& x)
1283 return ((numext::isinf)(numext::real(x)) || (numext::isinf)(numext::imag(x))) && (!(numext::isnan)(x));
1290template<
typename Scalar,
1293struct scalar_fuzzy_default_impl {};
1295template<
typename Scalar>
1296struct scalar_fuzzy_default_impl<Scalar, false, false>
1298 typedef typename NumTraits<Scalar>::Real RealScalar;
1299 template<
typename OtherScalar> EIGEN_DEVICE_FUNC
1300 static inline bool isMuchSmallerThan(
const Scalar& x,
const OtherScalar& y,
const RealScalar& prec)
1302 return numext::abs(x) <= numext::abs(y) * prec;
1305 static inline bool isApprox(
const Scalar& x,
const Scalar& y,
const RealScalar& prec)
1307 return numext::abs(x - y) <= numext::mini(numext::abs(x), numext::abs(y)) * prec;
1310 static inline bool isApproxOrLessThan(
const Scalar& x,
const Scalar& y,
const RealScalar& prec)
1312 return x <= y || isApprox(x, y, prec);
1316template<
typename Scalar>
1317struct scalar_fuzzy_default_impl<Scalar, false, true>
1319 typedef typename NumTraits<Scalar>::Real RealScalar;
1320 template<
typename OtherScalar> EIGEN_DEVICE_FUNC
1321 static inline bool isMuchSmallerThan(
const Scalar& x,
const Scalar&,
const RealScalar&)
1323 return x == Scalar(0);
1326 static inline bool isApprox(
const Scalar& x,
const Scalar& y,
const RealScalar&)
1331 static inline bool isApproxOrLessThan(
const Scalar& x,
const Scalar& y,
const RealScalar&)
1337template<
typename Scalar>
1338struct scalar_fuzzy_default_impl<Scalar, true, false>
1340 typedef typename NumTraits<Scalar>::Real RealScalar;
1341 template<
typename OtherScalar> EIGEN_DEVICE_FUNC
1342 static inline bool isMuchSmallerThan(
const Scalar& x,
const OtherScalar& y,
const RealScalar& prec)
1344 return numext::abs2(x) <= numext::abs2(y) * prec * prec;
1347 static inline bool isApprox(
const Scalar& x,
const Scalar& y,
const RealScalar& prec)
1349 return numext::abs2(x - y) <= numext::mini(numext::abs2(x), numext::abs2(y)) * prec * prec;
1353template<
typename Scalar>
1354struct scalar_fuzzy_impl : scalar_fuzzy_default_impl<Scalar, NumTraits<Scalar>::IsComplex, NumTraits<Scalar>::IsInteger> {};
1356template<
typename Scalar,
typename OtherScalar> EIGEN_DEVICE_FUNC
1357inline bool isMuchSmallerThan(
const Scalar& x,
const OtherScalar& y,
1358 const typename NumTraits<Scalar>::Real &precision = NumTraits<Scalar>::dummy_precision())
1360 return scalar_fuzzy_impl<Scalar>::template isMuchSmallerThan<OtherScalar>(x, y, precision);
1363template<
typename Scalar> EIGEN_DEVICE_FUNC
1364inline bool isApprox(
const Scalar& x,
const Scalar& y,
1365 const typename NumTraits<Scalar>::Real &precision = NumTraits<Scalar>::dummy_precision())
1367 return scalar_fuzzy_impl<Scalar>::isApprox(x, y, precision);
1370template<
typename Scalar> EIGEN_DEVICE_FUNC
1371inline bool isApproxOrLessThan(
const Scalar& x,
const Scalar& y,
1372 const typename NumTraits<Scalar>::Real &precision = NumTraits<Scalar>::dummy_precision())
1374 return scalar_fuzzy_impl<Scalar>::isApproxOrLessThan(x, y, precision);
1381template<>
struct random_impl<bool>
1383 static inline bool run()
1385 return random<int>(0,1)==0 ? false :
true;
1389template<>
struct scalar_fuzzy_impl<bool>
1391 typedef bool RealScalar;
1393 template<
typename OtherScalar> EIGEN_DEVICE_FUNC
1394 static inline bool isMuchSmallerThan(
const bool& x,
const bool&,
const bool&)
1400 static inline bool isApprox(
bool x,
bool y,
bool)
1406 static inline bool isApproxOrLessThan(
const bool& x,
const bool& y,
const bool&)
Namespace containing all symbols from the Eigen library.
Definition: Core:287
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_cosh_op< typename Derived::Scalar >, const Derived > cosh(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_real_op< typename Derived::Scalar >, const Derived > real(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_conjugate_op< typename Derived::Scalar >, const Derived > conj(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_abs2_op< typename Derived::Scalar >, const Derived > abs2(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_atan_op< typename Derived::Scalar >, const Derived > atan(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_round_op< typename Derived::Scalar >, const Derived > round(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_imag_op< typename Derived::Scalar >, const Derived > imag(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_asin_op< typename Derived::Scalar >, const Derived > asin(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_acos_op< typename Derived::Scalar >, const Derived > acos(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_sinh_op< typename Derived::Scalar >, const Derived > sinh(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_arg_op< typename Derived::Scalar >, const Derived > arg(const Eigen::ArrayBase< Derived > &x)