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> {};
102 struct real_impl<
std::complex<T> >
104 typedef T RealScalar;
106 static inline T run(
const std::complex<T>& x)
113 template<
typename Scalar>
116 typedef typename NumTraits<Scalar>::Real type;
123 template<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
124 struct imag_default_impl
126 typedef typename NumTraits<Scalar>::Real RealScalar;
128 static inline RealScalar run(
const Scalar&)
130 return RealScalar(0);
134 template<
typename Scalar>
135 struct imag_default_impl<Scalar,true>
137 typedef typename NumTraits<Scalar>::Real RealScalar;
139 static inline RealScalar run(
const Scalar& x)
146 template<
typename Scalar>
struct imag_impl : imag_default_impl<Scalar> {};
150 struct imag_impl<
std::complex<T> >
152 typedef T RealScalar;
154 static inline T run(
const std::complex<T>& x)
161 template<
typename Scalar>
164 typedef typename NumTraits<Scalar>::Real type;
171 template<
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];
187 template<
typename Scalar>
188 struct real_ref_retval
190 typedef typename NumTraits<Scalar>::Real & type;
197 template<
typename Scalar,
bool IsComplex>
198 struct 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];
213 template<
typename Scalar>
214 struct imag_ref_default_impl<Scalar, false>
217 static inline Scalar run(Scalar&)
222 static inline const Scalar run(
const Scalar&)
228 template<
typename Scalar>
229 struct imag_ref_impl : imag_ref_default_impl<Scalar, NumTraits<Scalar>::IsComplex> {};
231 template<
typename Scalar>
232 struct imag_ref_retval
234 typedef typename NumTraits<Scalar>::Real & type;
241 template<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
245 static inline Scalar run(
const Scalar& x)
251 template<
typename Scalar>
252 struct conj_impl<Scalar,true>
255 static inline Scalar run(
const Scalar& x)
262 template<
typename Scalar>
272 template<
typename Scalar,
bool IsComplex>
273 struct abs2_impl_default
275 typedef typename NumTraits<Scalar>::Real RealScalar;
277 static inline RealScalar run(
const Scalar& x)
283 template<
typename Scalar>
284 struct abs2_impl_default<Scalar, true>
286 typedef typename NumTraits<Scalar>::Real RealScalar;
288 static inline RealScalar run(
const Scalar& x)
294 template<
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);
305 template<
typename Scalar>
308 typedef typename NumTraits<Scalar>::Real type;
315 template<
typename Scalar,
bool IsComplex>
316 struct norm1_default_impl
318 typedef typename NumTraits<Scalar>::Real RealScalar;
320 static inline RealScalar run(
const Scalar& x)
322 EIGEN_USING_STD_MATH(
abs);
327 template<
typename Scalar>
328 struct norm1_default_impl<Scalar, false>
331 static inline Scalar run(
const Scalar& x)
333 EIGEN_USING_STD_MATH(
abs);
338 template<
typename Scalar>
339 struct norm1_impl : norm1_default_impl<Scalar, NumTraits<Scalar>::IsComplex> {};
341 template<
typename Scalar>
344 typedef typename NumTraits<Scalar>::Real type;
351 template<
typename Scalar>
struct hypot_impl;
353 template<
typename Scalar>
356 typedef typename NumTraits<Scalar>::Real type;
363 template<
typename OldType,
typename NewType>
367 static inline NewType run(
const OldType& x)
369 return static_cast<NewType
>(x);
375 template<
typename OldType,
typename NewType>
377 inline NewType cast(
const OldType& x)
379 return cast_impl<OldType, NewType>::run(x);
386 #if EIGEN_HAS_CXX11_MATH 387 template<
typename Scalar>
389 static inline Scalar run(
const Scalar& x)
391 EIGEN_STATIC_ASSERT((!NumTraits<Scalar>::IsComplex), NUMERIC_TYPE_MUST_BE_REAL)
397 template<
typename Scalar>
400 static inline Scalar run(
const Scalar& x)
402 EIGEN_STATIC_ASSERT((!NumTraits<Scalar>::IsComplex), NUMERIC_TYPE_MUST_BE_REAL)
403 EIGEN_USING_STD_MATH(
floor);
404 EIGEN_USING_STD_MATH(
ceil);
405 return (x > Scalar(0)) ?
floor(x + Scalar(0.5)) :
ceil(x - Scalar(0.5));
410 template<
typename Scalar>
420 #if EIGEN_HAS_CXX11_MATH 421 template<
typename Scalar>
423 static inline Scalar run(
const Scalar& x)
425 EIGEN_USING_STD_MATH(
arg);
430 template<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
431 struct arg_default_impl
433 typedef typename NumTraits<Scalar>::Real RealScalar;
435 static inline RealScalar run(
const Scalar& x)
437 return (x < Scalar(0)) ? Scalar(EIGEN_PI) : Scalar(0); }
440 template<
typename Scalar>
441 struct arg_default_impl<Scalar,true>
443 typedef typename NumTraits<Scalar>::Real RealScalar;
445 static inline RealScalar run(
const Scalar& x)
447 EIGEN_USING_STD_MATH(
arg);
452 template<
typename Scalar>
struct arg_impl : arg_default_impl<Scalar> {};
455 template<
typename Scalar>
458 typedef typename NumTraits<Scalar>::Real type;
465 namespace std_fallback {
468 template<
typename Scalar>
469 EIGEN_DEVICE_FUNC
inline Scalar
log1p(
const Scalar& x) {
470 EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
471 typedef typename NumTraits<Scalar>::Real RealScalar;
472 EIGEN_USING_STD_MATH(
log);
473 Scalar x1p = RealScalar(1) + x;
474 return numext::equal_strict(x1p, Scalar(1)) ? x : x * (
log(x1p) / (x1p - RealScalar(1)) );
478 template<
typename Scalar>
480 static inline Scalar run(
const Scalar& x)
482 EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
483 #if EIGEN_HAS_CXX11_MATH 486 using std_fallback::log1p;
492 template<
typename Scalar>
502 template<typename ScalarX,typename ScalarY, bool IsInteger = NumTraits<ScalarX>::IsInteger&&NumTraits<ScalarY>::IsInteger>
506 typedef typename ScalarBinaryOpTraits<ScalarX,ScalarY,internal::scalar_pow_op<ScalarX,ScalarY> >::ReturnType result_type;
507 static EIGEN_DEVICE_FUNC
inline result_type run(
const ScalarX& x,
const ScalarY& y)
509 EIGEN_USING_STD_MATH(pow);
514 template<
typename ScalarX,
typename ScalarY>
515 struct pow_impl<ScalarX,ScalarY, true>
517 typedef ScalarX result_type;
518 static EIGEN_DEVICE_FUNC
inline ScalarX run(ScalarX x, ScalarY y)
521 eigen_assert(!NumTraits<ScalarY>::IsSigned || y >= 0);
538 template<
typename Scalar,
541 struct random_default_impl {};
543 template<
typename Scalar>
544 struct random_impl : random_default_impl<Scalar, NumTraits<Scalar>::IsComplex, NumTraits<Scalar>::IsInteger> {};
546 template<
typename Scalar>
552 template<
typename Scalar>
inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random(
const Scalar& x,
const Scalar& y);
553 template<
typename Scalar>
inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random();
555 template<
typename Scalar>
556 struct random_default_impl<Scalar, false, false>
558 static inline Scalar run(
const Scalar& x,
const Scalar& y)
560 return x + (y-x) * Scalar(std::rand()) / Scalar(RAND_MAX);
562 static inline Scalar run()
564 return run(Scalar(NumTraits<Scalar>::IsSigned ? -1 : 0), Scalar(1));
569 meta_floor_log2_terminate,
570 meta_floor_log2_move_up,
571 meta_floor_log2_move_down,
572 meta_floor_log2_bogus
575 template<
unsigned int n,
int lower,
int upper>
struct meta_floor_log2_selector
577 enum { middle = (lower + upper) / 2,
578 value = (upper <= lower + 1) ? int(meta_floor_log2_terminate)
579 : (n < (1 << middle)) ? int(meta_floor_log2_move_down)
580 : (n==0) ? int(meta_floor_log2_bogus)
581 : int(meta_floor_log2_move_up)
585 template<
unsigned int n,
587 int upper =
sizeof(
unsigned int) * CHAR_BIT - 1,
588 int selector = meta_floor_log2_selector<n, lower, upper>::value>
589 struct meta_floor_log2 {};
591 template<
unsigned int n,
int lower,
int upper>
592 struct meta_floor_log2<n, lower, upper, meta_floor_log2_move_down>
594 enum { value = meta_floor_log2<n, lower, meta_floor_log2_selector<n, lower, upper>::middle>::value };
597 template<
unsigned int n,
int lower,
int upper>
598 struct meta_floor_log2<n, lower, upper, meta_floor_log2_move_up>
600 enum { value = meta_floor_log2<n, meta_floor_log2_selector<n, lower, upper>::middle, upper>::value };
603 template<
unsigned int n,
int lower,
int upper>
604 struct meta_floor_log2<n, lower, upper, meta_floor_log2_terminate>
606 enum { value = (n >= ((
unsigned int)(1) << (lower+1))) ? lower+1 : lower };
609 template<
unsigned int n,
int lower,
int upper>
610 struct meta_floor_log2<n, lower, upper, meta_floor_log2_bogus>
615 template<
typename Scalar>
616 struct random_default_impl<Scalar, false, true>
618 static inline Scalar run(
const Scalar& x,
const Scalar& y)
620 typedef typename conditional<NumTraits<Scalar>::IsSigned,std::ptrdiff_t,std::size_t>::type ScalarX;
625 std::size_t range = ScalarX(y)-ScalarX(x);
626 std::size_t offset = 0;
628 std::size_t divisor = 1;
629 std::size_t multiplier = 1;
630 if(range<RAND_MAX) divisor = (std::size_t(RAND_MAX)+1)/(range+1);
631 else multiplier = 1 + range/(std::size_t(RAND_MAX)+1);
633 offset = (std::size_t(std::rand()) * multiplier) / divisor;
634 }
while (offset > range);
635 return Scalar(ScalarX(x) + offset);
638 static inline Scalar run()
640 #ifdef EIGEN_MAKING_DOCS 641 return run(Scalar(NumTraits<Scalar>::IsSigned ? -10 : 0), Scalar(10));
643 enum { rand_bits = meta_floor_log2<(unsigned int)(RAND_MAX)+1>::value,
644 scalar_bits =
sizeof(Scalar) * CHAR_BIT,
645 shift = EIGEN_PLAIN_ENUM_MAX(0,
int(rand_bits) - int(scalar_bits)),
646 offset = NumTraits<Scalar>::IsSigned ? (1 << (EIGEN_PLAIN_ENUM_MIN(rand_bits,scalar_bits)-1)) : 0
648 return Scalar((std::rand() >> shift) - offset);
653 template<
typename Scalar>
654 struct random_default_impl<Scalar, true, false>
656 static inline Scalar run(
const Scalar& x,
const Scalar& y)
658 return Scalar(random(
real(x),
real(y)),
661 static inline Scalar run()
663 typedef typename NumTraits<Scalar>::Real RealScalar;
664 return Scalar(random<RealScalar>(), random<RealScalar>());
668 template<
typename Scalar>
669 inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random(
const Scalar& x,
const Scalar& y)
671 return EIGEN_MATHFUNC_IMPL(random, Scalar)::run(x, y);
674 template<
typename Scalar>
675 inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random()
677 return EIGEN_MATHFUNC_IMPL(random, Scalar)::run();
683 #if (EIGEN_HAS_CXX11_MATH && !(EIGEN_COMP_GNUC_STRICT && __FINITE_MATH_ONLY__)) || (EIGEN_COMP_MSVC>=1800) || (EIGEN_COMP_CLANG) 684 #define EIGEN_USE_STD_FPCLASSIFY 1 686 #define EIGEN_USE_STD_FPCLASSIFY 0 691 typename internal::enable_if<internal::is_integral<T>::value,
bool>::type
692 isnan_impl(
const T&) {
return false; }
696 typename internal::enable_if<internal::is_integral<T>::value,
bool>::type
697 isinf_impl(
const T&) {
return false; }
701 typename internal::enable_if<internal::is_integral<T>::value,
bool>::type
702 isfinite_impl(
const T&) {
return true; }
706 typename internal::enable_if<(!internal::is_integral<T>::value)&&(!NumTraits<T>::IsComplex),
bool>::type
707 isfinite_impl(
const T& x)
711 #elif EIGEN_USE_STD_FPCLASSIFY 713 return isfinite EIGEN_NOT_A_MACRO (x);
715 return x<=NumTraits<T>::highest() && x>=NumTraits<T>::lowest();
721 typename internal::enable_if<(!internal::is_integral<T>::value)&&(!NumTraits<T>::IsComplex),
bool>::type
722 isinf_impl(
const T& x)
726 #elif EIGEN_USE_STD_FPCLASSIFY 728 return isinf EIGEN_NOT_A_MACRO (x);
730 return x>NumTraits<T>::highest() || x<NumTraits<T>::lowest();
736 typename internal::enable_if<(!internal::is_integral<T>::value)&&(!NumTraits<T>::IsComplex),
bool>::type
737 isnan_impl(
const T& x)
741 #elif EIGEN_USE_STD_FPCLASSIFY 743 return isnan EIGEN_NOT_A_MACRO (x);
749 #if (!EIGEN_USE_STD_FPCLASSIFY) 753 template<
typename T> EIGEN_DEVICE_FUNC
bool isinf_msvc_helper(T x)
755 return _fpclass(x)==_FPCLASS_NINF || _fpclass(x)==_FPCLASS_PINF;
759 EIGEN_DEVICE_FUNC
inline bool isnan_impl(
const long double& x) {
return _isnan(x)!=0; }
760 EIGEN_DEVICE_FUNC
inline bool isnan_impl(
const double& x) {
return _isnan(x)!=0; }
761 EIGEN_DEVICE_FUNC
inline bool isnan_impl(
const float& x) {
return _isnan(x)!=0; }
763 EIGEN_DEVICE_FUNC
inline bool isinf_impl(
const long double& x) {
return isinf_msvc_helper(x); }
764 EIGEN_DEVICE_FUNC
inline bool isinf_impl(
const double& x) {
return isinf_msvc_helper(x); }
765 EIGEN_DEVICE_FUNC
inline bool isinf_impl(
const float& x) {
return isinf_msvc_helper(x); }
767 #elif (defined __FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ && EIGEN_COMP_GNUC) 769 #if EIGEN_GNUC_AT_LEAST(5,0) 770 #define EIGEN_TMP_NOOPT_ATTRIB EIGEN_DEVICE_FUNC inline __attribute__((optimize("no-finite-math-only"))) 774 #define EIGEN_TMP_NOOPT_ATTRIB EIGEN_DEVICE_FUNC inline __attribute__((noinline,optimize("no-finite-math-only"))) 777 template<> EIGEN_TMP_NOOPT_ATTRIB
bool isnan_impl(
const long double& x) {
return __builtin_isnan(x); }
778 template<> EIGEN_TMP_NOOPT_ATTRIB
bool isnan_impl(
const double& x) {
return __builtin_isnan(x); }
779 template<> EIGEN_TMP_NOOPT_ATTRIB
bool isnan_impl(
const float& x) {
return __builtin_isnan(x); }
780 template<> EIGEN_TMP_NOOPT_ATTRIB
bool isinf_impl(
const double& x) {
return __builtin_isinf(x); }
781 template<> EIGEN_TMP_NOOPT_ATTRIB
bool isinf_impl(
const float& x) {
return __builtin_isinf(x); }
782 template<> EIGEN_TMP_NOOPT_ATTRIB
bool isinf_impl(
const long double& x) {
return __builtin_isinf(x); }
784 #undef EIGEN_TMP_NOOPT_ATTRIB 791 template<
typename T> EIGEN_DEVICE_FUNC
bool isfinite_impl(
const std::complex<T>& x);
792 template<
typename T> EIGEN_DEVICE_FUNC
bool isnan_impl(
const std::complex<T>& x);
793 template<
typename T> EIGEN_DEVICE_FUNC
bool isinf_impl(
const std::complex<T>& x);
795 template<
typename T> T generic_fast_tanh_float(
const T& a_x);
805 #ifndef __CUDA_ARCH__ 808 EIGEN_ALWAYS_INLINE T mini(
const T& x,
const T& y)
810 EIGEN_USING_STD_MATH(min);
811 return min EIGEN_NOT_A_MACRO (x,y);
816 EIGEN_ALWAYS_INLINE T maxi(
const T& x,
const T& y)
818 EIGEN_USING_STD_MATH(max);
819 return max EIGEN_NOT_A_MACRO (x,y);
824 EIGEN_ALWAYS_INLINE T mini(
const T& x,
const T& y)
826 return y < x ? y : x;
830 EIGEN_ALWAYS_INLINE
float mini(
const float& x,
const float& y)
836 EIGEN_ALWAYS_INLINE T maxi(
const T& x,
const T& y)
838 return x < y ? y : x;
842 EIGEN_ALWAYS_INLINE
float maxi(
const float& x,
const float& y)
849 template<
typename Scalar>
851 inline EIGEN_MATHFUNC_RETVAL(
real, Scalar)
real(
const Scalar& x)
853 return EIGEN_MATHFUNC_IMPL(
real, Scalar)::run(x);
856 template<
typename Scalar>
858 inline typename internal::add_const_on_value_type< EIGEN_MATHFUNC_RETVAL(real_ref, Scalar) >::type real_ref(
const Scalar& x)
860 return internal::real_ref_impl<Scalar>::run(x);
863 template<
typename Scalar>
865 inline EIGEN_MATHFUNC_RETVAL(real_ref, Scalar) real_ref(Scalar& x)
867 return EIGEN_MATHFUNC_IMPL(real_ref, Scalar)::run(x);
870 template<
typename Scalar>
872 inline EIGEN_MATHFUNC_RETVAL(
imag, Scalar)
imag(
const Scalar& x)
874 return EIGEN_MATHFUNC_IMPL(
imag, Scalar)::run(x);
877 template<
typename Scalar>
879 inline EIGEN_MATHFUNC_RETVAL(
arg, Scalar)
arg(
const Scalar& x)
881 return EIGEN_MATHFUNC_IMPL(
arg, Scalar)::run(x);
884 template<
typename Scalar>
886 inline typename internal::add_const_on_value_type< EIGEN_MATHFUNC_RETVAL(imag_ref, Scalar) >::type imag_ref(
const Scalar& x)
888 return internal::imag_ref_impl<Scalar>::run(x);
891 template<
typename Scalar>
893 inline EIGEN_MATHFUNC_RETVAL(imag_ref, Scalar) imag_ref(Scalar& x)
895 return EIGEN_MATHFUNC_IMPL(imag_ref, Scalar)::run(x);
898 template<
typename Scalar>
900 inline EIGEN_MATHFUNC_RETVAL(
conj, Scalar)
conj(
const Scalar& x)
902 return EIGEN_MATHFUNC_IMPL(
conj, Scalar)::run(x);
905 template<
typename Scalar>
907 inline EIGEN_MATHFUNC_RETVAL(
abs2, Scalar)
abs2(
const Scalar& x)
909 return EIGEN_MATHFUNC_IMPL(
abs2, Scalar)::run(x);
912 template<
typename Scalar>
914 inline EIGEN_MATHFUNC_RETVAL(norm1, Scalar) norm1(
const Scalar& x)
916 return EIGEN_MATHFUNC_IMPL(norm1, Scalar)::run(x);
919 template<
typename Scalar>
921 inline EIGEN_MATHFUNC_RETVAL(hypot, Scalar) hypot(
const Scalar& x,
const Scalar& y)
923 return EIGEN_MATHFUNC_IMPL(hypot, Scalar)::run(x, y);
926 template<
typename Scalar>
928 inline EIGEN_MATHFUNC_RETVAL(
log1p, Scalar)
log1p(
const Scalar& x)
930 return EIGEN_MATHFUNC_IMPL(
log1p, Scalar)::run(x);
934 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
935 float log1p(
const float &x) { return ::log1pf(x); }
937 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
938 double log1p(
const double &x) { return ::log1p(x); }
941 template<
typename ScalarX,
typename ScalarY>
943 inline typename internal::pow_impl<ScalarX,ScalarY>::result_type pow(
const ScalarX& x,
const ScalarY& y)
945 return internal::pow_impl<ScalarX,ScalarY>::run(x, y);
948 template<
typename T> EIGEN_DEVICE_FUNC bool (
isnan) (
const T &x) {
return internal::isnan_impl(x); }
949 template<
typename T> EIGEN_DEVICE_FUNC bool (
isinf) (
const T &x) {
return internal::isinf_impl(x); }
950 template<
typename T> EIGEN_DEVICE_FUNC bool (
isfinite)(
const T &x) {
return internal::isfinite_impl(x); }
952 template<
typename Scalar>
954 inline EIGEN_MATHFUNC_RETVAL(
round, Scalar)
round(
const Scalar& x)
956 return EIGEN_MATHFUNC_IMPL(
round, Scalar)::run(x);
961 T (
floor)(
const T& x)
963 EIGEN_USING_STD_MATH(
floor);
968 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
969 float floor(
const float &x) { return ::floorf(x); }
971 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
972 double floor(
const double &x) { return ::floor(x); }
979 EIGEN_USING_STD_MATH(
ceil);
984 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
985 float ceil(
const float &x) { return ::ceilf(x); }
987 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
988 double ceil(
const double &x) { return ::ceil(x); }
994 inline int log2(
int x)
998 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 };
1004 return table[(v * 0x07C4ACDDU) >> 27];
1015 template<
typename T>
1016 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1019 EIGEN_USING_STD_MATH(
sqrt);
1023 template<
typename T>
1024 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1026 EIGEN_USING_STD_MATH(
log);
1031 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1032 float log(
const float &x) { return ::logf(x); }
1034 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1035 double log(
const double &x) { return ::log(x); }
1038 template<
typename T>
1039 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1040 typename internal::enable_if<NumTraits<T>::IsSigned || NumTraits<T>::IsComplex,
typename NumTraits<T>::Real>::type
1042 EIGEN_USING_STD_MATH(
abs);
1046 template<
typename T>
1047 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1048 typename internal::enable_if<!(NumTraits<T>::IsSigned || NumTraits<T>::IsComplex),
typename NumTraits<T>::Real>::type
1053 #if defined(__SYCL_DEVICE_ONLY__) 1054 EIGEN_ALWAYS_INLINE
float abs(
float x) {
return cl::sycl::fabs(x); }
1055 EIGEN_ALWAYS_INLINE
double abs(
double x) {
return cl::sycl::fabs(x); }
1056 #endif // defined(__SYCL_DEVICE_ONLY__) 1059 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1060 float abs(
const float &x) { return ::fabsf(x); }
1062 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1063 double abs(
const double &x) { return ::fabs(x); }
1065 template <> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1066 float abs(
const std::complex<float>& x) {
1067 return ::hypotf(x.real(), x.imag());
1070 template <> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1071 double abs(
const std::complex<double>& x) {
1072 return ::hypot(x.real(), x.imag());
1076 template<
typename T>
1077 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1079 EIGEN_USING_STD_MATH(
exp);
1084 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1085 float exp(
const float &x) { return ::expf(x); }
1087 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1088 double exp(
const double &x) { return ::exp(x); }
1091 template<
typename T>
1092 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1094 EIGEN_USING_STD_MATH(
cos);
1099 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1100 float cos(
const float &x) { return ::cosf(x); }
1102 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1103 double cos(
const double &x) { return ::cos(x); }
1106 template<
typename T>
1107 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1109 EIGEN_USING_STD_MATH(
sin);
1114 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1115 float sin(
const float &x) { return ::sinf(x); }
1117 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1118 double sin(
const double &x) { return ::sin(x); }
1121 template<
typename T>
1122 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1124 EIGEN_USING_STD_MATH(
tan);
1129 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1130 float tan(
const float &x) { return ::tanf(x); }
1132 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1133 double tan(
const double &x) { return ::tan(x); }
1136 template<
typename T>
1137 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1138 T
acos(
const T &x) {
1139 EIGEN_USING_STD_MATH(
acos);
1144 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1145 float acos(
const float &x) { return ::acosf(x); }
1147 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1148 double acos(
const double &x) { return ::acos(x); }
1151 template<
typename T>
1152 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1153 T
asin(
const T &x) {
1154 EIGEN_USING_STD_MATH(
asin);
1159 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1160 float asin(
const float &x) { return ::asinf(x); }
1162 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1163 double asin(
const double &x) { return ::asin(x); }
1166 template<
typename T>
1167 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1168 T
atan(
const T &x) {
1169 EIGEN_USING_STD_MATH(
atan);
1174 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1175 float atan(
const float &x) { return ::atanf(x); }
1177 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1178 double atan(
const double &x) { return ::atan(x); }
1182 template<
typename T>
1183 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1184 T
cosh(
const T &x) {
1185 EIGEN_USING_STD_MATH(
cosh);
1190 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1191 float cosh(
const float &x) { return ::coshf(x); }
1193 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1194 double cosh(
const double &x) { return ::cosh(x); }
1197 template<
typename T>
1198 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1199 T
sinh(
const T &x) {
1200 EIGEN_USING_STD_MATH(
sinh);
1205 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1206 float sinh(
const float &x) { return ::sinhf(x); }
1208 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1209 double sinh(
const double &x) { return ::sinh(x); }
1212 template<
typename T>
1213 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1214 T
tanh(
const T &x) {
1215 EIGEN_USING_STD_MATH(
tanh);
1219 #if (!defined(__CUDACC__)) && EIGEN_FAST_MATH 1220 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1221 float tanh(
float x) {
return internal::generic_fast_tanh_float(x); }
1225 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1226 float tanh(
const float &x) { return ::tanhf(x); }
1228 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1229 double tanh(
const double &x) { return ::tanh(x); }
1232 template <
typename T>
1233 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1234 T fmod(
const T& a,
const T& b) {
1235 EIGEN_USING_STD_MATH(fmod);
1241 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1242 float fmod(
const float& a,
const float& b) {
1243 return ::fmodf(a, b);
1247 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1248 double fmod(
const double& a,
const double& b) {
1249 return ::fmod(a, b);
1257 template<
typename T>
1258 EIGEN_DEVICE_FUNC
bool isfinite_impl(
const std::complex<T>& x)
1260 return (numext::isfinite)(numext::real(x)) && (numext::isfinite)(numext::imag(x));
1263 template<
typename T>
1264 EIGEN_DEVICE_FUNC
bool isnan_impl(
const std::complex<T>& x)
1266 return (numext::isnan)(numext::real(x)) || (numext::isnan)(numext::imag(x));
1269 template<
typename T>
1270 EIGEN_DEVICE_FUNC
bool isinf_impl(
const std::complex<T>& x)
1272 return ((numext::isinf)(numext::real(x)) || (numext::isinf)(numext::imag(x))) && (!(numext::isnan)(x));
1279 template<
typename Scalar,
1282 struct scalar_fuzzy_default_impl {};
1284 template<
typename Scalar>
1285 struct scalar_fuzzy_default_impl<Scalar, false, false>
1287 typedef typename NumTraits<Scalar>::Real RealScalar;
1288 template<
typename OtherScalar> EIGEN_DEVICE_FUNC
1289 static inline bool isMuchSmallerThan(
const Scalar& x,
const OtherScalar& y,
const RealScalar& prec)
1291 return numext::abs(x) <= numext::abs(y) * prec;
1294 static inline bool isApprox(
const Scalar& x,
const Scalar& y,
const RealScalar& prec)
1296 return numext::abs(x - y) <= numext::mini(numext::abs(x), numext::abs(y)) * prec;
1299 static inline bool isApproxOrLessThan(
const Scalar& x,
const Scalar& y,
const RealScalar& prec)
1301 return x <= y || isApprox(x, y, prec);
1305 template<
typename Scalar>
1306 struct scalar_fuzzy_default_impl<Scalar, false, true>
1308 typedef typename NumTraits<Scalar>::Real RealScalar;
1309 template<
typename OtherScalar> EIGEN_DEVICE_FUNC
1310 static inline bool isMuchSmallerThan(
const Scalar& x,
const Scalar&,
const RealScalar&)
1312 return x == Scalar(0);
1315 static inline bool isApprox(
const Scalar& x,
const Scalar& y,
const RealScalar&)
1320 static inline bool isApproxOrLessThan(
const Scalar& x,
const Scalar& y,
const RealScalar&)
1326 template<
typename Scalar>
1327 struct scalar_fuzzy_default_impl<Scalar, true, false>
1329 typedef typename NumTraits<Scalar>::Real RealScalar;
1330 template<
typename OtherScalar> EIGEN_DEVICE_FUNC
1331 static inline bool isMuchSmallerThan(
const Scalar& x,
const OtherScalar& y,
const RealScalar& prec)
1333 return numext::abs2(x) <= numext::abs2(y) * prec * prec;
1336 static inline bool isApprox(
const Scalar& x,
const Scalar& y,
const RealScalar& prec)
1338 return numext::abs2(x - y) <= numext::mini(numext::abs2(x), numext::abs2(y)) * prec * prec;
1342 template<
typename Scalar>
1343 struct scalar_fuzzy_impl : scalar_fuzzy_default_impl<Scalar, NumTraits<Scalar>::IsComplex, NumTraits<Scalar>::IsInteger> {};
1345 template<
typename Scalar,
typename OtherScalar> EIGEN_DEVICE_FUNC
1346 inline bool isMuchSmallerThan(
const Scalar& x,
const OtherScalar& y,
1347 const typename NumTraits<Scalar>::Real &precision = NumTraits<Scalar>::dummy_precision())
1349 return scalar_fuzzy_impl<Scalar>::template isMuchSmallerThan<OtherScalar>(x, y, precision);
1352 template<
typename Scalar> EIGEN_DEVICE_FUNC
1353 inline bool isApprox(
const Scalar& x,
const Scalar& y,
1354 const typename NumTraits<Scalar>::Real &precision = NumTraits<Scalar>::dummy_precision())
1356 return scalar_fuzzy_impl<Scalar>::isApprox(x, y, precision);
1359 template<
typename Scalar> EIGEN_DEVICE_FUNC
1360 inline bool isApproxOrLessThan(
const Scalar& x,
const Scalar& y,
1361 const typename NumTraits<Scalar>::Real &precision = NumTraits<Scalar>::dummy_precision())
1363 return scalar_fuzzy_impl<Scalar>::isApproxOrLessThan(x, y, precision);
1370 template<>
struct random_impl<bool>
1372 static inline bool run()
1374 return random<int>(0,1)==0 ?
false :
true;
1378 template<>
struct scalar_fuzzy_impl<bool>
1380 typedef bool RealScalar;
1382 template<
typename OtherScalar> EIGEN_DEVICE_FUNC
1383 static inline bool isMuchSmallerThan(
const bool& x,
const bool&,
const bool&)
1389 static inline bool isApprox(
bool x,
bool y,
bool)
1395 static inline bool isApproxOrLessThan(
const bool& x,
const bool& y,
const bool&)
1407 #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:306
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)