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 23 long abs(
long x) {
return (labs(x)); }
24 double abs(
double x) {
return (fabs(x)); }
25 float abs(
float x) {
return (fabsf(x)); }
26 long double abs(
long double x) {
return (fabsl(x)); }
51 template<
typename T,
typename dummy =
void>
52 struct global_math_functions_filtering_base
57 template<
typename T>
struct always_void {
typedef void type; };
60 struct 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 75 template<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
76 struct real_default_impl
78 typedef typename NumTraits<Scalar>::Real RealScalar;
80 static inline RealScalar run(
const Scalar& x)
86 template<
typename Scalar>
87 struct real_default_impl<Scalar,true>
89 typedef typename NumTraits<Scalar>::Real RealScalar;
91 static inline RealScalar run(
const Scalar& x)
98 template<
typename Scalar>
struct real_impl : real_default_impl<Scalar> {};
100 template<
typename Scalar>
103 typedef typename NumTraits<Scalar>::Real type;
110 template<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
111 struct imag_default_impl
113 typedef typename NumTraits<Scalar>::Real RealScalar;
115 static inline RealScalar run(
const Scalar&)
117 return RealScalar(0);
121 template<
typename Scalar>
122 struct imag_default_impl<Scalar,true>
124 typedef typename NumTraits<Scalar>::Real RealScalar;
126 static inline RealScalar run(
const Scalar& x)
133 template<
typename Scalar>
struct imag_impl : imag_default_impl<Scalar> {};
135 template<
typename Scalar>
138 typedef typename NumTraits<Scalar>::Real type;
145 template<
typename Scalar>
148 typedef typename NumTraits<Scalar>::Real RealScalar;
150 static inline RealScalar& run(Scalar& x)
152 return reinterpret_cast<RealScalar*
>(&x)[0];
155 static inline const RealScalar& run(
const Scalar& x)
157 return reinterpret_cast<const RealScalar*
>(&x)[0];
161 template<
typename Scalar>
162 struct real_ref_retval
164 typedef typename NumTraits<Scalar>::Real & type;
171 template<
typename Scalar,
bool IsComplex>
172 struct imag_ref_default_impl
174 typedef typename NumTraits<Scalar>::Real RealScalar;
176 static inline RealScalar& run(Scalar& x)
178 return reinterpret_cast<RealScalar*
>(&x)[1];
181 static inline const RealScalar& run(
const Scalar& x)
183 return reinterpret_cast<RealScalar*
>(&x)[1];
187 template<
typename Scalar>
188 struct imag_ref_default_impl<Scalar, false>
191 static inline Scalar run(Scalar&)
196 static inline const Scalar run(
const Scalar&)
202 template<
typename Scalar>
203 struct imag_ref_impl : imag_ref_default_impl<Scalar, NumTraits<Scalar>::IsComplex> {};
205 template<
typename Scalar>
206 struct imag_ref_retval
208 typedef typename NumTraits<Scalar>::Real & type;
215 template<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
219 static inline Scalar run(
const Scalar& x)
225 template<
typename Scalar>
226 struct conj_impl<Scalar,true>
229 static inline Scalar run(
const Scalar& x)
236 template<
typename Scalar>
246 template<
typename Scalar,
bool IsComplex>
247 struct abs2_impl_default
249 typedef typename NumTraits<Scalar>::Real RealScalar;
251 static inline RealScalar run(
const Scalar& x)
257 template<
typename Scalar>
258 struct abs2_impl_default<Scalar, true>
260 typedef typename NumTraits<Scalar>::Real RealScalar;
262 static inline RealScalar run(
const Scalar& x)
268 template<
typename Scalar>
271 typedef typename NumTraits<Scalar>::Real RealScalar;
273 static inline RealScalar run(
const Scalar& x)
275 return abs2_impl_default<Scalar,NumTraits<Scalar>::IsComplex>::run(x);
279 template<
typename Scalar>
282 typedef typename NumTraits<Scalar>::Real type;
289 template<
typename Scalar,
bool IsComplex>
290 struct norm1_default_impl
292 typedef typename NumTraits<Scalar>::Real RealScalar;
294 static inline RealScalar run(
const Scalar& x)
296 EIGEN_USING_STD_MATH(
abs);
301 template<
typename Scalar>
302 struct norm1_default_impl<Scalar, false>
305 static inline Scalar run(
const Scalar& x)
307 EIGEN_USING_STD_MATH(
abs);
312 template<
typename Scalar>
313 struct norm1_impl : norm1_default_impl<Scalar, NumTraits<Scalar>::IsComplex> {};
315 template<
typename Scalar>
318 typedef typename NumTraits<Scalar>::Real type;
325 template<
typename Scalar>
328 typedef typename NumTraits<Scalar>::Real RealScalar;
329 static inline RealScalar run(
const Scalar& x,
const Scalar& y)
331 EIGEN_USING_STD_MATH(
abs);
332 EIGEN_USING_STD_MATH(
sqrt);
333 RealScalar _x =
abs(x);
334 RealScalar _y =
abs(y);
346 if(p==RealScalar(0))
return RealScalar(0);
347 return p *
sqrt(RealScalar(1) + qp*qp);
351 template<
typename Scalar>
354 typedef typename NumTraits<Scalar>::Real type;
361 template<
typename OldType,
typename NewType>
365 static inline NewType run(
const OldType& x)
367 return static_cast<NewType
>(x);
373 template<
typename OldType,
typename NewType>
375 inline NewType cast(
const OldType& x)
377 return cast_impl<OldType, NewType>::run(x);
384 #if EIGEN_HAS_CXX11_MATH 385 template<
typename Scalar>
387 static inline Scalar run(
const Scalar& x)
389 EIGEN_STATIC_ASSERT((!NumTraits<Scalar>::IsComplex), NUMERIC_TYPE_MUST_BE_REAL)
395 template<
typename Scalar>
398 static inline Scalar run(
const Scalar& x)
400 EIGEN_STATIC_ASSERT((!NumTraits<Scalar>::IsComplex), NUMERIC_TYPE_MUST_BE_REAL)
401 EIGEN_USING_STD_MATH(
floor);
402 EIGEN_USING_STD_MATH(
ceil);
403 return (x > Scalar(0)) ? floor(x + Scalar(0.5)) : ceil(x - Scalar(0.5));
408 template<
typename Scalar>
418 #if EIGEN_HAS_CXX11_MATH 419 template<
typename Scalar>
421 static inline Scalar run(
const Scalar& x)
423 EIGEN_USING_STD_MATH(
arg);
428 template<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
429 struct arg_default_impl
431 typedef typename NumTraits<Scalar>::Real RealScalar;
433 static inline RealScalar run(
const Scalar& x)
435 return (x < Scalar(0)) ? Scalar(EIGEN_PI) : Scalar(0); }
438 template<
typename Scalar>
439 struct arg_default_impl<Scalar,true>
441 typedef typename NumTraits<Scalar>::Real RealScalar;
443 static inline RealScalar run(
const Scalar& x)
445 EIGEN_USING_STD_MATH(
arg);
450 template<
typename Scalar>
struct arg_impl : arg_default_impl<Scalar> {};
453 template<
typename Scalar>
456 typedef typename NumTraits<Scalar>::Real type;
462 template<typename Scalar, bool isComplex = NumTraits<Scalar>::IsComplex >
465 static EIGEN_DEVICE_FUNC
inline Scalar run(
const Scalar& x)
467 EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
468 typedef typename NumTraits<Scalar>::Real RealScalar;
469 EIGEN_USING_STD_MATH(
log);
470 Scalar x1p = RealScalar(1) + x;
471 return ( x1p == Scalar(1) ) ? x : x * ( log(x1p) / (x1p - RealScalar(1)) );
475 #if EIGEN_HAS_CXX11_MATH && !defined(__CUDACC__) 476 template<
typename Scalar>
477 struct log1p_impl<Scalar, false> {
478 static inline Scalar run(
const Scalar& x)
480 EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
487 template<
typename Scalar>
497 template<typename ScalarX,typename ScalarY, bool IsInteger = NumTraits<ScalarX>::IsInteger&&NumTraits<ScalarY>::IsInteger>
501 typedef typename ScalarBinaryOpTraits<ScalarX,ScalarY,internal::scalar_pow_op<ScalarX,ScalarY> >::ReturnType result_type;
502 static EIGEN_DEVICE_FUNC
inline result_type run(
const ScalarX& x,
const ScalarY& y)
504 EIGEN_USING_STD_MATH(pow);
509 template<
typename ScalarX,
typename ScalarY>
510 struct pow_impl<ScalarX,ScalarY, true>
512 typedef ScalarX result_type;
513 static EIGEN_DEVICE_FUNC
inline ScalarX run(ScalarX x, ScalarY y)
516 eigen_assert(!NumTraits<ScalarY>::IsSigned || y >= 0);
533 template<
typename Scalar,
536 struct random_default_impl {};
538 template<
typename Scalar>
539 struct random_impl : random_default_impl<Scalar, NumTraits<Scalar>::IsComplex, NumTraits<Scalar>::IsInteger> {};
541 template<
typename Scalar>
547 template<
typename Scalar>
inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random(const Scalar& x, const Scalar& y);
548 template<typename Scalar> inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random();
550 template<typename Scalar>
551 struct random_default_impl<Scalar, false, false>
553 static inline Scalar run(
const Scalar& x,
const Scalar& y)
555 return x + (y-x) * Scalar(std::rand()) / Scalar(RAND_MAX);
557 static inline Scalar run()
559 return run(Scalar(NumTraits<Scalar>::IsSigned ? -1 : 0), Scalar(1));
564 meta_floor_log2_terminate,
565 meta_floor_log2_move_up,
566 meta_floor_log2_move_down,
567 meta_floor_log2_bogus
570 template<
unsigned int n,
int lower,
int upper>
struct meta_floor_log2_selector
572 enum { middle = (lower + upper) / 2,
573 value = (upper <= lower + 1) ? int(meta_floor_log2_terminate)
574 : (n < (1 << middle)) ? int(meta_floor_log2_move_down)
575 : (n==0) ? int(meta_floor_log2_bogus)
576 : int(meta_floor_log2_move_up)
580 template<
unsigned int n,
582 int upper =
sizeof(
unsigned int) * CHAR_BIT - 1,
583 int selector = meta_floor_log2_selector<n, lower, upper>::value>
584 struct meta_floor_log2 {};
586 template<
unsigned int n,
int lower,
int upper>
587 struct meta_floor_log2<n, lower, upper, meta_floor_log2_move_down>
589 enum { value = meta_floor_log2<n, lower, meta_floor_log2_selector<n, lower, upper>::middle>::value };
592 template<
unsigned int n,
int lower,
int upper>
593 struct meta_floor_log2<n, lower, upper, meta_floor_log2_move_up>
595 enum { value = meta_floor_log2<n, meta_floor_log2_selector<n, lower, upper>::middle, upper>::value };
598 template<
unsigned int n,
int lower,
int upper>
599 struct meta_floor_log2<n, lower, upper, meta_floor_log2_terminate>
601 enum { value = (n >= ((
unsigned int)(1) << (lower+1))) ? lower+1 : lower };
604 template<
unsigned int n,
int lower,
int upper>
605 struct meta_floor_log2<n, lower, upper, meta_floor_log2_bogus>
610 template<
typename Scalar>
611 struct random_default_impl<Scalar, false, true>
613 static inline Scalar run(
const Scalar& x,
const Scalar& y)
615 typedef typename conditional<NumTraits<Scalar>::IsSigned,std::ptrdiff_t,std::size_t>::type ScalarX;
618 std::size_t range = ScalarX(y)-ScalarX(x);
619 std::size_t offset = 0;
621 std::size_t divisor = (range+RAND_MAX-1)/(range+1);
622 std::size_t multiplier = (range+RAND_MAX-1)/std::size_t(RAND_MAX);
625 offset = ( (std::size_t(std::rand()) * multiplier) / divisor );
626 }
while (offset > range);
628 return Scalar(ScalarX(x) + offset);
631 static inline Scalar run()
633 #ifdef EIGEN_MAKING_DOCS 634 return run(Scalar(NumTraits<Scalar>::IsSigned ? -10 : 0), Scalar(10));
636 enum { rand_bits = meta_floor_log2<(unsigned int)(RAND_MAX)+1>::value,
637 scalar_bits =
sizeof(Scalar) * CHAR_BIT,
638 shift = EIGEN_PLAIN_ENUM_MAX(0,
int(rand_bits) - int(scalar_bits)),
639 offset = NumTraits<Scalar>::IsSigned ? (1 << (EIGEN_PLAIN_ENUM_MIN(rand_bits,scalar_bits)-1)) : 0
641 return Scalar((std::rand() >> shift) - offset);
646 template<
typename Scalar>
647 struct random_default_impl<Scalar, true, false>
649 static inline Scalar run(
const Scalar& x,
const Scalar& y)
651 return Scalar(random(
real(x),
real(y)),
654 static inline Scalar run()
656 typedef typename NumTraits<Scalar>::Real RealScalar;
657 return Scalar(random<RealScalar>(), random<RealScalar>());
661 template<
typename Scalar>
662 inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random(const Scalar& x, const Scalar& y)
664 return EIGEN_MATHFUNC_IMPL(random, Scalar)::run(x, y);
667 template<
typename Scalar>
668 inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random()
670 return EIGEN_MATHFUNC_IMPL(random, Scalar)::run();
676 #if (EIGEN_HAS_CXX11_MATH && !(EIGEN_COMP_GNUC_STRICT && __FINITE_MATH_ONLY__)) || (EIGEN_COMP_MSVC>=1800) || (EIGEN_COMP_CLANG) 677 #define EIGEN_USE_STD_FPCLASSIFY 1 679 #define EIGEN_USE_STD_FPCLASSIFY 0 684 typename internal::enable_if<internal::is_integral<T>::value,
bool>::type
685 isnan_impl(
const T&) {
return false; }
689 typename internal::enable_if<internal::is_integral<T>::value,
bool>::type
690 isinf_impl(
const T&) {
return false; }
694 typename internal::enable_if<internal::is_integral<T>::value,
bool>::type
695 isfinite_impl(
const T&) {
return true; }
699 typename internal::enable_if<(!internal::is_integral<T>::value)&&(!NumTraits<T>::IsComplex),
bool>::type
700 isfinite_impl(
const T& x)
704 #elif EIGEN_USE_STD_FPCLASSIFY 706 return isfinite EIGEN_NOT_A_MACRO (x);
708 return x<=NumTraits<T>::highest() && x>=NumTraits<T>::lowest();
714 typename internal::enable_if<(!internal::is_integral<T>::value)&&(!NumTraits<T>::IsComplex),
bool>::type
715 isinf_impl(
const T& x)
719 #elif EIGEN_USE_STD_FPCLASSIFY 721 return isinf EIGEN_NOT_A_MACRO (x);
723 return x>NumTraits<T>::highest() || x<NumTraits<T>::lowest();
729 typename internal::enable_if<(!internal::is_integral<T>::value)&&(!NumTraits<T>::IsComplex),
bool>::type
730 isnan_impl(
const T& x)
734 #elif EIGEN_USE_STD_FPCLASSIFY 736 return isnan EIGEN_NOT_A_MACRO (x);
742 #if (!EIGEN_USE_STD_FPCLASSIFY) 746 template<
typename T> EIGEN_DEVICE_FUNC
bool isinf_msvc_helper(T x)
748 return _fpclass(x)==_FPCLASS_NINF || _fpclass(x)==_FPCLASS_PINF;
752 EIGEN_DEVICE_FUNC
inline bool isnan_impl(
const long double& x) {
return _isnan(x)!=0; }
753 EIGEN_DEVICE_FUNC
inline bool isnan_impl(
const double& x) {
return _isnan(x)!=0; }
754 EIGEN_DEVICE_FUNC
inline bool isnan_impl(
const float& x) {
return _isnan(x)!=0; }
756 EIGEN_DEVICE_FUNC
inline bool isinf_impl(
const long double& x) {
return isinf_msvc_helper(x); }
757 EIGEN_DEVICE_FUNC
inline bool isinf_impl(
const double& x) {
return isinf_msvc_helper(x); }
758 EIGEN_DEVICE_FUNC
inline bool isinf_impl(
const float& x) {
return isinf_msvc_helper(x); }
760 #elif (defined __FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ && EIGEN_COMP_GNUC) 762 #if EIGEN_GNUC_AT_LEAST(5,0) 763 #define EIGEN_TMP_NOOPT_ATTRIB EIGEN_DEVICE_FUNC inline __attribute__((optimize("no-finite-math-only"))) 767 #define EIGEN_TMP_NOOPT_ATTRIB EIGEN_DEVICE_FUNC inline __attribute__((noinline,optimize("no-finite-math-only"))) 770 template<> EIGEN_TMP_NOOPT_ATTRIB
bool isnan_impl(
const long double& x) {
return __builtin_isnan(x); }
771 template<> EIGEN_TMP_NOOPT_ATTRIB
bool isnan_impl(
const double& x) {
return __builtin_isnan(x); }
772 template<> EIGEN_TMP_NOOPT_ATTRIB
bool isnan_impl(
const float& x) {
return __builtin_isnan(x); }
773 template<> EIGEN_TMP_NOOPT_ATTRIB
bool isinf_impl(
const double& x) {
return __builtin_isinf(x); }
774 template<> EIGEN_TMP_NOOPT_ATTRIB
bool isinf_impl(
const float& x) {
return __builtin_isinf(x); }
775 template<> EIGEN_TMP_NOOPT_ATTRIB
bool isinf_impl(
const long double& x) {
return __builtin_isinf(x); }
777 #undef EIGEN_TMP_NOOPT_ATTRIB 784 template<
typename T> EIGEN_DEVICE_FUNC
bool isfinite_impl(
const std::complex<T>& x);
785 template<
typename T> EIGEN_DEVICE_FUNC
bool isnan_impl(
const std::complex<T>& x);
786 template<
typename T> EIGEN_DEVICE_FUNC
bool isinf_impl(
const std::complex<T>& x);
796 #ifndef __CUDA_ARCH__ 799 EIGEN_ALWAYS_INLINE T mini(
const T& x,
const T& y)
801 EIGEN_USING_STD_MATH(min);
802 return min EIGEN_NOT_A_MACRO (x,y);
807 EIGEN_ALWAYS_INLINE T maxi(
const T& x,
const T& y)
809 EIGEN_USING_STD_MATH(max);
810 return max EIGEN_NOT_A_MACRO (x,y);
815 EIGEN_ALWAYS_INLINE T mini(
const T& x,
const T& y)
817 return y < x ? y : x;
821 EIGEN_ALWAYS_INLINE
float mini(
const float& x,
const float& y)
827 EIGEN_ALWAYS_INLINE T maxi(
const T& x,
const T& y)
829 return x < y ? y : x;
833 EIGEN_ALWAYS_INLINE
float maxi(
const float& x,
const float& y)
840 template<
typename Scalar>
842 inline EIGEN_MATHFUNC_RETVAL(
real, Scalar)
real(const Scalar& x)
844 return EIGEN_MATHFUNC_IMPL(
real, Scalar)::run(x);
847 template<
typename Scalar>
849 inline typename internal::add_const_on_value_type< EIGEN_MATHFUNC_RETVAL(real_ref, Scalar) >::type real_ref(
const Scalar& x)
851 return internal::real_ref_impl<Scalar>::run(x);
854 template<
typename Scalar>
856 inline EIGEN_MATHFUNC_RETVAL(real_ref, Scalar) real_ref(Scalar& x)
858 return EIGEN_MATHFUNC_IMPL(real_ref, Scalar)::run(x);
861 template<
typename Scalar>
863 inline EIGEN_MATHFUNC_RETVAL(
imag, Scalar)
imag(const Scalar& x)
865 return EIGEN_MATHFUNC_IMPL(
imag, Scalar)::run(x);
868 template<
typename Scalar>
870 inline EIGEN_MATHFUNC_RETVAL(
arg, Scalar)
arg(const Scalar& x)
872 return EIGEN_MATHFUNC_IMPL(
arg, Scalar)::run(x);
875 template<
typename Scalar>
877 inline typename internal::add_const_on_value_type< EIGEN_MATHFUNC_RETVAL(imag_ref, Scalar) >::type imag_ref(
const Scalar& x)
879 return internal::imag_ref_impl<Scalar>::run(x);
882 template<
typename Scalar>
884 inline EIGEN_MATHFUNC_RETVAL(imag_ref, Scalar) imag_ref(Scalar& x)
886 return EIGEN_MATHFUNC_IMPL(imag_ref, Scalar)::run(x);
889 template<
typename Scalar>
891 inline EIGEN_MATHFUNC_RETVAL(
conj, Scalar)
conj(const Scalar& x)
893 return EIGEN_MATHFUNC_IMPL(
conj, Scalar)::run(x);
896 template<
typename Scalar>
898 inline EIGEN_MATHFUNC_RETVAL(
abs2, Scalar)
abs2(const Scalar& x)
900 return EIGEN_MATHFUNC_IMPL(
abs2, Scalar)::run(x);
903 template<
typename Scalar>
905 inline EIGEN_MATHFUNC_RETVAL(norm1, Scalar) norm1(const Scalar& x)
907 return EIGEN_MATHFUNC_IMPL(norm1, Scalar)::run(x);
910 template<
typename Scalar>
912 inline EIGEN_MATHFUNC_RETVAL(hypot, Scalar) hypot(const Scalar& x, const Scalar& y)
914 return EIGEN_MATHFUNC_IMPL(hypot, Scalar)::run(x, y);
917 template<
typename Scalar>
919 inline EIGEN_MATHFUNC_RETVAL(log1p, Scalar) log1p(const Scalar& x)
921 return EIGEN_MATHFUNC_IMPL(log1p, Scalar)::run(x);
924 template<
typename ScalarX,
typename ScalarY>
926 inline typename internal::pow_impl<ScalarX,ScalarY>::result_type pow(
const ScalarX& x,
const ScalarY& y)
928 return internal::pow_impl<ScalarX,ScalarY>::run(x, y);
931 template<
typename T> EIGEN_DEVICE_FUNC bool (
isnan) (
const T &x) {
return internal::isnan_impl(x); }
932 template<
typename T> EIGEN_DEVICE_FUNC bool (
isinf) (
const T &x) {
return internal::isinf_impl(x); }
933 template<
typename T> EIGEN_DEVICE_FUNC bool (
isfinite)(
const T &x) {
return internal::isfinite_impl(x); }
935 template<
typename Scalar>
937 inline EIGEN_MATHFUNC_RETVAL(round, Scalar) round(const Scalar& x)
939 return EIGEN_MATHFUNC_IMPL(round, Scalar)::run(x);
944 T (floor)(
const T& x)
946 EIGEN_USING_STD_MATH(floor);
951 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
952 float floor(
const float &x) { return ::floorf(x); }
954 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
955 double floor(
const double &x) { return ::floor(x); }
962 EIGEN_USING_STD_MATH(ceil);
967 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
968 float ceil(
const float &x) { return ::ceilf(x); }
970 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
971 double ceil(
const double &x) { return ::ceil(x); }
977 inline int log2(
int x)
981 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 };
987 return table[(v * 0x07C4ACDDU) >> 27];
999 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1002 EIGEN_USING_STD_MATH(
sqrt);
1006 template<
typename T>
1007 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1009 EIGEN_USING_STD_MATH(log);
1014 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1015 float log(
const float &x) { return ::logf(x); }
1017 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1018 double log(
const double &x) { return ::log(x); }
1021 template<
typename T>
1022 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1023 typename NumTraits<T>::Real
abs(
const T &x) {
1024 EIGEN_USING_STD_MATH(
abs);
1029 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1030 float abs(
const float &x) { return ::fabsf(x); }
1032 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1033 double abs(
const double &x) { return ::fabs(x); }
1036 template<
typename T>
1037 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1039 EIGEN_USING_STD_MATH(
exp);
1044 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1045 float exp(
const float &x) { return ::expf(x); }
1047 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1048 double exp(
const double &x) { return ::exp(x); }
1051 template<
typename T>
1052 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1054 EIGEN_USING_STD_MATH(
cos);
1059 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1060 float cos(
const float &x) { return ::cosf(x); }
1062 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1063 double cos(
const double &x) { return ::cos(x); }
1066 template<
typename T>
1067 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1069 EIGEN_USING_STD_MATH(
sin);
1074 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1075 float sin(
const float &x) { return ::sinf(x); }
1077 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1078 double sin(
const double &x) { return ::sin(x); }
1081 template<
typename T>
1082 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1084 EIGEN_USING_STD_MATH(
tan);
1089 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1090 float tan(
const float &x) { return ::tanf(x); }
1092 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1093 double tan(
const double &x) { return ::tan(x); }
1096 template<
typename T>
1097 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1098 T
acos(
const T &x) {
1099 EIGEN_USING_STD_MATH(
acos);
1104 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1105 float acos(
const float &x) { return ::acosf(x); }
1107 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1108 double acos(
const double &x) { return ::acos(x); }
1111 template<
typename T>
1112 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1113 T
asin(
const T &x) {
1114 EIGEN_USING_STD_MATH(
asin);
1119 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1120 float asin(
const float &x) { return ::asinf(x); }
1122 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1123 double asin(
const double &x) { return ::asin(x); }
1126 template<
typename T>
1127 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1128 T
atan(
const T &x) {
1129 EIGEN_USING_STD_MATH(
atan);
1134 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1135 float atan(
const float &x) { return ::atanf(x); }
1137 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1138 double atan(
const double &x) { return ::atan(x); }
1142 template<
typename T>
1143 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1144 T
cosh(
const T &x) {
1145 EIGEN_USING_STD_MATH(
cosh);
1150 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1151 float cosh(
const float &x) { return ::coshf(x); }
1153 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1154 double cosh(
const double &x) { return ::cosh(x); }
1157 template<
typename T>
1158 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1159 T
sinh(
const T &x) {
1160 EIGEN_USING_STD_MATH(
sinh);
1165 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1166 float sinh(
const float &x) { return ::sinhf(x); }
1168 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1169 double sinh(
const double &x) { return ::sinh(x); }
1172 template<
typename T>
1173 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1174 T
tanh(
const T &x) {
1175 EIGEN_USING_STD_MATH(
tanh);
1180 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1181 float tanh(
const float &x) { return ::tanhf(x); }
1183 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1184 double tanh(
const double &x) { return ::tanh(x); }
1187 template <
typename T>
1188 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1189 T fmod(
const T& a,
const T& b) {
1190 EIGEN_USING_STD_MATH(fmod);
1196 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1197 float fmod(
const float& a,
const float& b) {
1198 return ::fmodf(a, b);
1202 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1203 double fmod(
const double& a,
const double& b) {
1204 return ::fmod(a, b);
1212 template<
typename T>
1213 EIGEN_DEVICE_FUNC
bool isfinite_impl(
const std::complex<T>& x)
1215 return (numext::isfinite)(numext::real(x)) && (numext::isfinite)(numext::imag(x));
1218 template<
typename T>
1219 EIGEN_DEVICE_FUNC
bool isnan_impl(
const std::complex<T>& x)
1221 return (numext::isnan)(numext::real(x)) || (numext::isnan)(numext::imag(x));
1224 template<
typename T>
1225 EIGEN_DEVICE_FUNC
bool isinf_impl(
const std::complex<T>& x)
1227 return ((numext::isinf)(numext::real(x)) || (numext::isinf)(numext::imag(x))) && (!(numext::isnan)(x));
1234 template<
typename Scalar,
1237 struct scalar_fuzzy_default_impl {};
1239 template<
typename Scalar>
1240 struct scalar_fuzzy_default_impl<Scalar, false, false>
1242 typedef typename NumTraits<Scalar>::Real RealScalar;
1243 template<
typename OtherScalar> EIGEN_DEVICE_FUNC
1244 static inline bool isMuchSmallerThan(
const Scalar& x,
const OtherScalar& y,
const RealScalar& prec)
1246 return numext::abs(x) <= numext::abs(y) * prec;
1249 static inline bool isApprox(
const Scalar& x,
const Scalar& y,
const RealScalar& prec)
1251 return numext::abs(x - y) <= numext::mini(numext::abs(x), numext::abs(y)) * prec;
1254 static inline bool isApproxOrLessThan(
const Scalar& x,
const Scalar& y,
const RealScalar& prec)
1256 return x <= y || isApprox(x, y, prec);
1260 template<
typename Scalar>
1261 struct scalar_fuzzy_default_impl<Scalar, false, true>
1263 typedef typename NumTraits<Scalar>::Real RealScalar;
1264 template<
typename OtherScalar> EIGEN_DEVICE_FUNC
1265 static inline bool isMuchSmallerThan(
const Scalar& x,
const Scalar&,
const RealScalar&)
1267 return x == Scalar(0);
1270 static inline bool isApprox(
const Scalar& x,
const Scalar& y,
const RealScalar&)
1275 static inline bool isApproxOrLessThan(
const Scalar& x,
const Scalar& y,
const RealScalar&)
1281 template<
typename Scalar>
1282 struct scalar_fuzzy_default_impl<Scalar, true, false>
1284 typedef typename NumTraits<Scalar>::Real RealScalar;
1285 template<
typename OtherScalar>
1286 static inline bool isMuchSmallerThan(
const Scalar& x,
const OtherScalar& y,
const RealScalar& prec)
1288 return numext::abs2(x) <= numext::abs2(y) * prec * prec;
1290 static inline bool isApprox(
const Scalar& x,
const Scalar& y,
const RealScalar& prec)
1292 return numext::abs2(x - y) <= numext::mini(numext::abs2(x), numext::abs2(y)) * prec * prec;
1296 template<
typename Scalar>
1297 struct scalar_fuzzy_impl : scalar_fuzzy_default_impl<Scalar, NumTraits<Scalar>::IsComplex, NumTraits<Scalar>::IsInteger> {};
1299 template<
typename Scalar,
typename OtherScalar> EIGEN_DEVICE_FUNC
1300 inline bool isMuchSmallerThan(
const Scalar& x,
const OtherScalar& y,
1301 const typename NumTraits<Scalar>::Real &precision = NumTraits<Scalar>::dummy_precision())
1303 return scalar_fuzzy_impl<Scalar>::template isMuchSmallerThan<OtherScalar>(x, y, precision);
1306 template<
typename Scalar> EIGEN_DEVICE_FUNC
1307 inline bool isApprox(
const Scalar& x,
const Scalar& y,
1308 const typename NumTraits<Scalar>::Real &precision = NumTraits<Scalar>::dummy_precision())
1310 return scalar_fuzzy_impl<Scalar>::isApprox(x, y, precision);
1313 template<
typename Scalar> EIGEN_DEVICE_FUNC
1314 inline bool isApproxOrLessThan(
const Scalar& x,
const Scalar& y,
1315 const typename NumTraits<Scalar>::Real &precision = NumTraits<Scalar>::dummy_precision())
1317 return scalar_fuzzy_impl<Scalar>::isApproxOrLessThan(x, y, precision);
1324 template<>
struct random_impl<bool>
1326 static inline bool run()
1328 return random<int>(0,1)==0 ?
false :
true;
1332 template<>
struct scalar_fuzzy_impl<bool>
1334 typedef bool RealScalar;
1336 template<
typename OtherScalar> EIGEN_DEVICE_FUNC
1337 static inline bool isMuchSmallerThan(
const bool& x,
const bool&,
const bool&)
1343 static inline bool isApprox(
bool x,
bool y,
bool)
1349 static inline bool isApproxOrLessThan(
const bool& x,
const bool& y,
const bool&)
1361 #endif // EIGEN_MATHFUNCTIONS_H const Eigen::CwiseUnaryOp< Eigen::internal::scalar_tanh_op< typename Derived::Scalar >, const Derived > tanh(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_isfinite_op< typename Derived::Scalar >, const Derived > isfinite(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_sqrt_op< typename Derived::Scalar >, const Derived > sqrt(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_arg_op< typename Derived::Scalar >, const Derived > arg(const Eigen::ArrayBase< Derived > &x)
Namespace containing all symbols from the Eigen library.
Definition: Core:271
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_ceil_op< typename Derived::Scalar >, const Derived > ceil(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_abs2_op< typename Derived::Scalar >, const Derived > abs2(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_isnan_op< typename Derived::Scalar >, const Derived > isnan(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_cos_op< typename Derived::Scalar >, const Derived > cos(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_round_op< typename Derived::Scalar >, const Derived > round(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_floor_op< typename Derived::Scalar >, const Derived > floor(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_log1p_op< typename Derived::Scalar >, const Derived > log1p(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_isinf_op< typename Derived::Scalar >, const Derived > isinf(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_abs_op< typename Derived::Scalar >, const Derived > abs(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_cosh_op< typename Derived::Scalar >, const Derived > cosh(const Eigen::ArrayBase< Derived > &x)
Definition: Eigen_Colamd.h:50
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_log_op< typename Derived::Scalar >, const Derived > log(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_tan_op< typename Derived::Scalar >, const Derived > tan(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_sin_op< typename Derived::Scalar >, const Derived > sin(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_exp_op< typename Derived::Scalar >, const Derived > exp(const Eigen::ArrayBase< Derived > &x)