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)
290 return x.real()*x.real() + x.imag()*x.imag();
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;
318template<
typename Scalar>
319struct norm1_default_impl<Scalar,true>
321 typedef typename NumTraits<Scalar>::Real RealScalar;
323 static inline RealScalar run(
const Scalar& x)
325 EIGEN_USING_STD_MATH(abs);
326 return abs(x.real()) + abs(x.imag());
330template<
typename Scalar>
331struct norm1_default_impl<Scalar, false>
334 static inline Scalar run(
const Scalar& x)
336 EIGEN_USING_STD_MATH(abs);
341template<
typename Scalar>
342struct norm1_impl : norm1_default_impl<Scalar, NumTraits<Scalar>::IsComplex> {};
344template<
typename Scalar>
347 typedef typename NumTraits<Scalar>::Real type;
354template<
typename Scalar>
struct hypot_impl;
356template<
typename Scalar>
359 typedef typename NumTraits<Scalar>::Real type;
366template<
typename OldType,
typename NewType>
370 static inline NewType run(
const OldType& x)
372 return static_cast<NewType
>(x);
378template<
typename OldType,
typename NewType>
380inline NewType cast(
const OldType& x)
382 return cast_impl<OldType, NewType>::run(x);
389#if EIGEN_HAS_CXX11_MATH
390 template<
typename Scalar>
392 static inline Scalar run(
const Scalar& x)
394 EIGEN_STATIC_ASSERT((!NumTraits<Scalar>::IsComplex), NUMERIC_TYPE_MUST_BE_REAL)
400 template<
typename Scalar>
403 static inline Scalar run(
const Scalar& x)
405 EIGEN_STATIC_ASSERT((!NumTraits<Scalar>::IsComplex), NUMERIC_TYPE_MUST_BE_REAL)
406 EIGEN_USING_STD_MATH(floor);
407 EIGEN_USING_STD_MATH(ceil);
408 return (x > Scalar(0)) ? floor(x + Scalar(0.5)) : ceil(x - Scalar(0.5));
413template<
typename Scalar>
423#if EIGEN_HAS_CXX11_MATH
424 template<
typename Scalar>
426 static inline Scalar run(
const Scalar& x)
428 EIGEN_USING_STD_MATH(arg);
433 template<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
434 struct arg_default_impl
436 typedef typename NumTraits<Scalar>::Real RealScalar;
438 static inline RealScalar run(
const Scalar& x)
440 return (x < Scalar(0)) ? Scalar(EIGEN_PI) : Scalar(0); }
443 template<
typename Scalar>
444 struct arg_default_impl<Scalar,true>
446 typedef typename NumTraits<Scalar>::Real RealScalar;
448 static inline RealScalar run(
const Scalar& x)
450 EIGEN_USING_STD_MATH(arg);
455 template<
typename Scalar>
struct arg_impl : arg_default_impl<Scalar> {};
458template<
typename Scalar>
461 typedef typename NumTraits<Scalar>::Real type;
469namespace std_fallback {
473 template<
typename Scalar>
474 EIGEN_DEVICE_FUNC
inline Scalar expm1(
const Scalar& x) {
475 EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
476 typedef typename NumTraits<Scalar>::Real RealScalar;
478 EIGEN_USING_STD_MATH(exp);
480 if (numext::equal_strict(u, Scalar(1))) {
483 Scalar um1 = u - RealScalar(1);
484 if (numext::equal_strict(um1, Scalar(-1))) {
485 return RealScalar(-1);
488 EIGEN_USING_STD_MATH(log);
489 return (u - RealScalar(1)) * x / log(u);
493template<
typename Scalar>
495 EIGEN_DEVICE_FUNC
static inline Scalar run(
const Scalar& x)
497 EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
498 #if EIGEN_HAS_CXX11_MATH
501 using std_fallback::expm1;
508template <
typename RealScalar>
509struct expm1_impl<std::complex<RealScalar> > {
510 EIGEN_DEVICE_FUNC
static inline std::complex<RealScalar> run(
511 const std::complex<RealScalar>& x) {
512 EIGEN_STATIC_ASSERT_NON_INTEGER(RealScalar)
513 return std_fallback::expm1(x);
517template<
typename Scalar>
527namespace std_fallback {
530 template<
typename Scalar>
531 EIGEN_DEVICE_FUNC
inline Scalar log1p(
const Scalar& x) {
532 EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
533 typedef typename NumTraits<Scalar>::Real RealScalar;
534 EIGEN_USING_STD_MATH(log);
535 Scalar x1p = RealScalar(1) + x;
536 return numext::equal_strict(x1p, Scalar(1)) ? x : x * ( log(x1p) / (x1p - RealScalar(1)) );
540template<
typename Scalar>
542 static EIGEN_DEVICE_FUNC
inline Scalar run(
const Scalar& x)
544 EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
545 #if EIGEN_HAS_CXX11_MATH
548 using std_fallback::log1p;
555template <
typename RealScalar>
556struct log1p_impl<std::complex<RealScalar> > {
557 EIGEN_DEVICE_FUNC
static inline std::complex<RealScalar> run(
558 const std::complex<RealScalar>& x) {
559 EIGEN_STATIC_ASSERT_NON_INTEGER(RealScalar)
560 return std_fallback::log1p(x);
564template<
typename Scalar>
574template<typename ScalarX,typename ScalarY, bool IsInteger = NumTraits<ScalarX>::IsInteger&&NumTraits<ScalarY>::IsInteger>
578 typedef typename ScalarBinaryOpTraits<ScalarX,ScalarY,internal::scalar_pow_op<ScalarX,ScalarY> >::ReturnType result_type;
579 static EIGEN_DEVICE_FUNC
inline result_type run(
const ScalarX& x,
const ScalarY& y)
581 EIGEN_USING_STD_MATH(
pow);
586template<
typename ScalarX,
typename ScalarY>
587struct pow_impl<ScalarX,ScalarY, true>
589 typedef ScalarX result_type;
590 static EIGEN_DEVICE_FUNC
inline ScalarX run(ScalarX x, ScalarY y)
593 eigen_assert(!NumTraits<ScalarY>::IsSigned || y >= 0);
610template<
typename Scalar,
613struct random_default_impl {};
615template<
typename Scalar>
616struct random_impl : random_default_impl<Scalar, NumTraits<Scalar>::IsComplex, NumTraits<Scalar>::IsInteger> {};
618template<
typename Scalar>
624template<
typename Scalar>
inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random(
const Scalar& x,
const Scalar& y);
625template<
typename Scalar>
inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random();
628 meta_floor_log2_terminate,
629 meta_floor_log2_move_up,
630 meta_floor_log2_move_down,
631 meta_floor_log2_bogus
634template<
unsigned int n,
int lower,
int upper>
struct meta_floor_log2_selector
636 enum { middle = (lower + upper) / 2,
637 value = (upper <= lower + 1) ? int(meta_floor_log2_terminate)
638 : (n < (1 << middle)) ? int(meta_floor_log2_move_down)
639 : (n==0) ? int(meta_floor_log2_bogus)
640 : int(meta_floor_log2_move_up)
644template<
unsigned int n,
646 int upper =
sizeof(
unsigned int) * CHAR_BIT - 1,
647 int selector = meta_floor_log2_selector<n, lower, upper>::value>
648struct meta_floor_log2 {};
650template<
unsigned int n,
int lower,
int upper>
651struct meta_floor_log2<n, lower, upper, meta_floor_log2_move_down>
653 enum { value = meta_floor_log2<n, lower, meta_floor_log2_selector<n, lower, upper>::middle>::value };
656template<
unsigned int n,
int lower,
int upper>
657struct meta_floor_log2<n, lower, upper, meta_floor_log2_move_up>
659 enum { value = meta_floor_log2<n, meta_floor_log2_selector<n, lower, upper>::middle, upper>::value };
662template<
unsigned int n,
int lower,
int upper>
663struct meta_floor_log2<n, lower, upper, meta_floor_log2_terminate>
665 enum { value = (n >= ((
unsigned int)(1) << (lower+1))) ? lower+1 : lower };
668template<
unsigned int n,
int lower,
int upper>
669struct meta_floor_log2<n, lower, upper, meta_floor_log2_bogus>
674#define EIGEN_RAND_MAX INT_MAX
677inline int random_int() {
678#if RAND_MAX == INT_MAX
682 rand_bits = meta_floor_log2<(
unsigned int)(RAND_MAX)+1>::value,
683 int_bits = meta_floor_log2<(
unsigned int)(INT_MAX)+1>::value,
685 unsigned int out = std::rand();
686 for (
int bit = rand_bits; bit < int(int_bits); bit += rand_bits) {
687 out = (out << rand_bits) ^ std::rand();
689 return static_cast<int>(out & INT_MAX);
693template<
typename Scalar>
694struct random_default_impl<Scalar, false, false>
696 static inline Scalar run(
const Scalar& x,
const Scalar& y)
698 return x + (y-x) * Scalar(random_int()) / Scalar(EIGEN_RAND_MAX);
700 static inline Scalar run()
702 return run(Scalar(NumTraits<Scalar>::IsSigned ? -1 : 0), Scalar(1));
706template<
typename Scalar>
707struct random_default_impl<Scalar, false, true>
709 static inline Scalar run(
const Scalar& x,
const Scalar& y)
714 typedef typename make_unsigned<Scalar>::type ScalarU;
718 typedef typename conditional<(ScalarU(-1) > unsigned(-1)), ScalarU,
unsigned>::type ScalarX;
722 ScalarX range = ScalarX(y) - ScalarX(x);
725 ScalarX multiplier = 1;
726 const unsigned rand_max = EIGEN_RAND_MAX;
727 if (range <= rand_max) divisor = (rand_max + 1) / (range + 1);
728 else multiplier = 1 + range / (rand_max + 1);
731 offset = (unsigned(random_int()) * multiplier) / divisor;
732 }
while (offset > range);
733 return Scalar(ScalarX(x) + offset);
736 static inline Scalar run()
738#ifdef EIGEN_MAKING_DOCS
739 return run(Scalar(NumTraits<Scalar>::IsSigned ? -10 : 0), Scalar(10));
741 enum { rand_bits = meta_floor_log2<(
unsigned int)(EIGEN_RAND_MAX)+1>::value,
742 scalar_bits =
sizeof(Scalar) * CHAR_BIT,
743 shift = EIGEN_PLAIN_ENUM_MAX(0,
int(rand_bits) -
int(scalar_bits)),
744 offset = NumTraits<Scalar>::IsSigned ? (1 << (EIGEN_PLAIN_ENUM_MIN(rand_bits,scalar_bits)-1)) : 0
746 return Scalar((random_int() >> shift) - offset);
751template<
typename Scalar>
752struct random_default_impl<Scalar, true, false>
754 static inline Scalar run(
const Scalar& x,
const Scalar& y)
756 return Scalar(random(x.real(), y.real()),
757 random(x.imag(), y.imag()));
759 static inline Scalar run()
761 typedef typename NumTraits<Scalar>::Real RealScalar;
762 return Scalar(random<RealScalar>(), random<RealScalar>());
766template<
typename Scalar>
767inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random(
const Scalar& x,
const Scalar& y)
769 return EIGEN_MATHFUNC_IMPL(random, Scalar)::run(x, y);
772template<
typename Scalar>
773inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random()
775 return EIGEN_MATHFUNC_IMPL(random, Scalar)::run();
781#if (EIGEN_HAS_CXX11_MATH && !(EIGEN_COMP_GNUC_STRICT && __FINITE_MATH_ONLY__)) || (EIGEN_COMP_MSVC>=1800) || (EIGEN_COMP_CLANG)
782#define EIGEN_USE_STD_FPCLASSIFY 1
784#define EIGEN_USE_STD_FPCLASSIFY 0
789typename internal::enable_if<internal::is_integral<T>::value,
bool>::type
790isnan_impl(
const T&) {
return false; }
794typename internal::enable_if<internal::is_integral<T>::value,
bool>::type
795isinf_impl(
const T&) {
return false; }
799typename internal::enable_if<internal::is_integral<T>::value,
bool>::type
800isfinite_impl(
const T&) {
return true; }
804typename internal::enable_if<(!internal::is_integral<T>::value)&&(!NumTraits<T>::IsComplex),
bool>::type
805isfinite_impl(
const T& x)
808 return (::isfinite)(x);
809 #elif EIGEN_USE_STD_FPCLASSIFY
811 return isfinite EIGEN_NOT_A_MACRO (x);
813 return x<=NumTraits<T>::highest() && x>=NumTraits<T>::lowest();
819typename internal::enable_if<(!internal::is_integral<T>::value)&&(!NumTraits<T>::IsComplex),
bool>::type
820isinf_impl(
const T& x)
824 #elif EIGEN_USE_STD_FPCLASSIFY
826 return isinf EIGEN_NOT_A_MACRO (x);
828 return x>NumTraits<T>::highest() || x<NumTraits<T>::lowest();
834typename internal::enable_if<(!internal::is_integral<T>::value)&&(!NumTraits<T>::IsComplex),
bool>::type
835isnan_impl(
const T& x)
839 #elif EIGEN_USE_STD_FPCLASSIFY
841 return isnan EIGEN_NOT_A_MACRO (x);
847#if (!EIGEN_USE_STD_FPCLASSIFY)
851template<
typename T> EIGEN_DEVICE_FUNC
bool isinf_msvc_helper(T x)
853 return _fpclass(x)==_FPCLASS_NINF || _fpclass(x)==_FPCLASS_PINF;
857EIGEN_DEVICE_FUNC
inline bool isnan_impl(
const long double& x) {
return _isnan(x)!=0; }
858EIGEN_DEVICE_FUNC
inline bool isnan_impl(
const double& x) {
return _isnan(x)!=0; }
859EIGEN_DEVICE_FUNC
inline bool isnan_impl(
const float& x) {
return _isnan(x)!=0; }
861EIGEN_DEVICE_FUNC
inline bool isinf_impl(
const long double& x) {
return isinf_msvc_helper(x); }
862EIGEN_DEVICE_FUNC
inline bool isinf_impl(
const double& x) {
return isinf_msvc_helper(x); }
863EIGEN_DEVICE_FUNC
inline bool isinf_impl(
const float& x) {
return isinf_msvc_helper(x); }
865#elif (defined __FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ && EIGEN_COMP_GNUC)
867#if EIGEN_GNUC_AT_LEAST(5,0)
868 #define EIGEN_TMP_NOOPT_ATTRIB EIGEN_DEVICE_FUNC inline __attribute__((optimize("no-finite-math-only")))
872 #define EIGEN_TMP_NOOPT_ATTRIB EIGEN_DEVICE_FUNC inline __attribute__((noinline,optimize("no-finite-math-only")))
875template<> EIGEN_TMP_NOOPT_ATTRIB
bool isnan_impl(
const long double& x) {
return __builtin_isnan(x); }
876template<> EIGEN_TMP_NOOPT_ATTRIB
bool isnan_impl(
const double& x) {
return __builtin_isnan(x); }
877template<> EIGEN_TMP_NOOPT_ATTRIB
bool isnan_impl(
const float& x) {
return __builtin_isnan(x); }
878template<> EIGEN_TMP_NOOPT_ATTRIB
bool isinf_impl(
const double& x) {
return __builtin_isinf(x); }
879template<> EIGEN_TMP_NOOPT_ATTRIB
bool isinf_impl(
const float& x) {
return __builtin_isinf(x); }
880template<> EIGEN_TMP_NOOPT_ATTRIB
bool isinf_impl(
const long double& x) {
return __builtin_isinf(x); }
882#undef EIGEN_TMP_NOOPT_ATTRIB
889template<
typename T> EIGEN_DEVICE_FUNC
bool isfinite_impl(
const std::complex<T>& x);
890template<
typename T> EIGEN_DEVICE_FUNC
bool isnan_impl(
const std::complex<T>& x);
891template<
typename T> EIGEN_DEVICE_FUNC
bool isinf_impl(
const std::complex<T>& x);
893template<
typename T> T generic_fast_tanh_float(
const T& a_x);
906EIGEN_ALWAYS_INLINE T mini(
const T& x,
const T& y)
908 EIGEN_USING_STD_MATH(min);
909 return min EIGEN_NOT_A_MACRO (x,y);
914EIGEN_ALWAYS_INLINE T maxi(
const T& x,
const T& y)
916 EIGEN_USING_STD_MATH(max);
917 return max EIGEN_NOT_A_MACRO (x,y);
922EIGEN_ALWAYS_INLINE T mini(
const T& x,
const T& y)
924 return y < x ? y : x;
928EIGEN_ALWAYS_INLINE
float mini(
const float& x,
const float& y)
934EIGEN_ALWAYS_INLINE T maxi(
const T& x,
const T& y)
936 return x < y ? y : x;
940EIGEN_ALWAYS_INLINE
float maxi(
const float& x,
const float& y)
947template<
typename Scalar>
949inline EIGEN_MATHFUNC_RETVAL(real, Scalar)
real(
const Scalar& x)
951 return EIGEN_MATHFUNC_IMPL(real, Scalar)::run(x);
954template<
typename Scalar>
956inline typename internal::add_const_on_value_type< EIGEN_MATHFUNC_RETVAL(real_ref, Scalar) >::type real_ref(
const Scalar& x)
958 return internal::real_ref_impl<Scalar>::run(x);
961template<
typename Scalar>
963inline EIGEN_MATHFUNC_RETVAL(real_ref, Scalar) real_ref(Scalar& x)
965 return EIGEN_MATHFUNC_IMPL(real_ref, Scalar)::run(x);
968template<
typename Scalar>
970inline EIGEN_MATHFUNC_RETVAL(imag, Scalar)
imag(
const Scalar& x)
972 return EIGEN_MATHFUNC_IMPL(imag, Scalar)::run(x);
975template<
typename Scalar>
977inline EIGEN_MATHFUNC_RETVAL(arg, Scalar)
arg(
const Scalar& x)
979 return EIGEN_MATHFUNC_IMPL(arg, Scalar)::run(x);
982template<
typename Scalar>
984inline typename internal::add_const_on_value_type< EIGEN_MATHFUNC_RETVAL(imag_ref, Scalar) >::type imag_ref(
const Scalar& x)
986 return internal::imag_ref_impl<Scalar>::run(x);
989template<
typename Scalar>
991inline EIGEN_MATHFUNC_RETVAL(imag_ref, Scalar) imag_ref(Scalar& x)
993 return EIGEN_MATHFUNC_IMPL(imag_ref, Scalar)::run(x);
996template<
typename Scalar>
998inline EIGEN_MATHFUNC_RETVAL(conj, Scalar)
conj(
const Scalar& x)
1000 return EIGEN_MATHFUNC_IMPL(conj, Scalar)::run(x);
1003template<
typename Scalar>
1005inline EIGEN_MATHFUNC_RETVAL(abs2, Scalar)
abs2(
const Scalar& x)
1007 return EIGEN_MATHFUNC_IMPL(abs2, Scalar)::run(x);
1011inline bool abs2(
bool x) {
return x; }
1013template<
typename Scalar>
1015inline EIGEN_MATHFUNC_RETVAL(norm1, Scalar) norm1(
const Scalar& x)
1017 return EIGEN_MATHFUNC_IMPL(norm1, Scalar)::run(x);
1020template<
typename Scalar>
1022inline EIGEN_MATHFUNC_RETVAL(hypot, Scalar) hypot(
const Scalar& x,
const Scalar& y)
1024 return EIGEN_MATHFUNC_IMPL(hypot, Scalar)::run(x, y);
1027template<
typename Scalar>
1029inline EIGEN_MATHFUNC_RETVAL(log1p, Scalar) log1p(
const Scalar& x)
1031 return EIGEN_MATHFUNC_IMPL(log1p, Scalar)::run(x);
1035template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1036float log1p(
const float &x) { return ::log1pf(x); }
1038template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1039double log1p(
const double &x) { return ::log1p(x); }
1042template<
typename ScalarX,
typename ScalarY>
1044inline typename internal::pow_impl<ScalarX,ScalarY>::result_type pow(
const ScalarX& x,
const ScalarY& y)
1046 return internal::pow_impl<ScalarX,ScalarY>::run(x, y);
1049template<
typename T> EIGEN_DEVICE_FUNC bool (isnan) (
const T &x) {
return internal::isnan_impl(x); }
1050template<
typename T> EIGEN_DEVICE_FUNC bool (isinf) (
const T &x) {
return internal::isinf_impl(x); }
1051template<
typename T> EIGEN_DEVICE_FUNC bool (isfinite)(
const T &x) {
return internal::isfinite_impl(x); }
1053template<
typename Scalar>
1055inline EIGEN_MATHFUNC_RETVAL(round, Scalar)
round(
const Scalar& x)
1057 return EIGEN_MATHFUNC_IMPL(round, Scalar)::run(x);
1062T (floor)(
const T& x)
1064 EIGEN_USING_STD_MATH(floor);
1069template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1070float floor(
const float &x) { return ::floorf(x); }
1072template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1073double floor(
const double &x) { return ::floor(x); }
1080 EIGEN_USING_STD_MATH(ceil);
1085template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1086float ceil(
const float &x) { return ::ceilf(x); }
1088template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1089double ceil(
const double &x) { return ::ceil(x); }
1095inline int log2(
int x)
1099 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 };
1105 return table[(v * 0x07C4ACDDU) >> 27];
1118EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1121 EIGEN_USING_STD_MATH(sqrt);
1126EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1128 EIGEN_USING_STD_MATH(log);
1133template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1134float log(
const float &x) { return ::logf(x); }
1136template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1137double log(
const double &x) { return ::log(x); }
1141EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1142typename internal::enable_if<NumTraits<T>::IsSigned || NumTraits<T>::IsComplex,
typename NumTraits<T>::Real>::type
1144 EIGEN_USING_STD_MATH(abs);
1149EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1150typename internal::enable_if<!(NumTraits<T>::IsSigned || NumTraits<T>::IsComplex),
typename NumTraits<T>::Real>::type
1155#if defined(__SYCL_DEVICE_ONLY__)
1156EIGEN_ALWAYS_INLINE
float abs(
float x) {
return cl::sycl::fabs(x); }
1157EIGEN_ALWAYS_INLINE
double abs(
double x) {
return cl::sycl::fabs(x); }
1161template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1162float abs(
const float &x) { return ::fabsf(x); }
1164template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1165double abs(
const double &x) { return ::fabs(x); }
1167template <> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1168float abs(
const std::complex<float>& x) {
1169 return ::hypotf(x.real(), x.imag());
1172template <> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1173double abs(
const std::complex<double>& x) {
1174 return ::hypot(x.real(), x.imag());
1179EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1181 EIGEN_USING_STD_MATH(exp);
1186template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1187float exp(
const float &x) { return ::expf(x); }
1189template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1190double exp(
const double &x) { return ::exp(x); }
1194EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1196 EIGEN_USING_STD_MATH(cos);
1201template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1202float cos(
const float &x) { return ::cosf(x); }
1204template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1205double cos(
const double &x) { return ::cos(x); }
1209EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1211 EIGEN_USING_STD_MATH(sin);
1216template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1217float sin(
const float &x) { return ::sinf(x); }
1219template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1220double sin(
const double &x) { return ::sin(x); }
1224EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1226 EIGEN_USING_STD_MATH(tan);
1231template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1232float tan(
const float &x) { return ::tanf(x); }
1234template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1235double tan(
const double &x) { return ::tan(x); }
1239EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1241 EIGEN_USING_STD_MATH(acos);
1246template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1247float acos(
const float &x) { return ::acosf(x); }
1249template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1250double acos(
const double &x) { return ::acos(x); }
1254EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1256 EIGEN_USING_STD_MATH(asin);
1261template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1262float asin(
const float &x) { return ::asinf(x); }
1264template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1265double asin(
const double &x) { return ::asin(x); }
1269EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1271 EIGEN_USING_STD_MATH(atan);
1276template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1277float atan(
const float &x) { return ::atanf(x); }
1279template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1280double atan(
const double &x) { return ::atan(x); }
1285EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1287 EIGEN_USING_STD_MATH(cosh);
1292template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1293float cosh(
const float &x) { return ::coshf(x); }
1295template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1296double cosh(
const double &x) { return ::cosh(x); }
1300EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1302 EIGEN_USING_STD_MATH(sinh);
1307template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1308float sinh(
const float &x) { return ::sinhf(x); }
1310template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1311double sinh(
const double &x) { return ::sinh(x); }
1315EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1317 EIGEN_USING_STD_MATH(tanh);
1321#if (!defined(EIGEN_CUDACC)) && EIGEN_FAST_MATH
1322EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1323float tanh(
float x) {
return internal::generic_fast_tanh_float(x); }
1327template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1328float tanh(
const float &x) { return ::tanhf(x); }
1330template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1331double tanh(
const double &x) { return ::tanh(x); }
1334template <
typename T>
1335EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1336T fmod(
const T& a,
const T& b) {
1337 EIGEN_USING_STD_MATH(fmod);
1343EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1344float fmod(
const float& a,
const float& b) {
1345 return ::fmodf(a, b);
1349EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1350double fmod(
const double& a,
const double& b) {
1351 return ::fmod(a, b);
1360EIGEN_DEVICE_FUNC
bool isfinite_impl(
const std::complex<T>& x)
1362 return (numext::isfinite)(numext::real(x)) && (numext::isfinite)(numext::imag(x));
1366EIGEN_DEVICE_FUNC
bool isnan_impl(
const std::complex<T>& x)
1368 return (numext::isnan)(numext::real(x)) || (numext::isnan)(numext::imag(x));
1372EIGEN_DEVICE_FUNC
bool isinf_impl(
const std::complex<T>& x)
1374 return ((numext::isinf)(numext::real(x)) || (numext::isinf)(numext::imag(x))) && (!(numext::isnan)(x));
1381template<
typename Scalar,
1384struct scalar_fuzzy_default_impl {};
1386template<
typename Scalar>
1387struct scalar_fuzzy_default_impl<Scalar, false, false>
1389 typedef typename NumTraits<Scalar>::Real RealScalar;
1390 template<
typename OtherScalar> EIGEN_DEVICE_FUNC
1391 static inline bool isMuchSmallerThan(
const Scalar& x,
const OtherScalar& y,
const RealScalar& prec)
1393 return numext::abs(x) <= numext::abs(y) * prec;
1396 static inline bool isApprox(
const Scalar& x,
const Scalar& y,
const RealScalar& prec)
1398 return numext::abs(x - y) <= numext::mini(numext::abs(x), numext::abs(y)) * prec;
1401 static inline bool isApproxOrLessThan(
const Scalar& x,
const Scalar& y,
const RealScalar& prec)
1403 return x <= y || isApprox(x, y, prec);
1407template<
typename Scalar>
1408struct scalar_fuzzy_default_impl<Scalar, false, true>
1410 typedef typename NumTraits<Scalar>::Real RealScalar;
1411 template<
typename OtherScalar> EIGEN_DEVICE_FUNC
1412 static inline bool isMuchSmallerThan(
const Scalar& x,
const Scalar&,
const RealScalar&)
1414 return x == Scalar(0);
1417 static inline bool isApprox(
const Scalar& x,
const Scalar& y,
const RealScalar&)
1422 static inline bool isApproxOrLessThan(
const Scalar& x,
const Scalar& y,
const RealScalar&)
1428template<
typename Scalar>
1429struct scalar_fuzzy_default_impl<Scalar, true, false>
1431 typedef typename NumTraits<Scalar>::Real RealScalar;
1432 template<
typename OtherScalar> EIGEN_DEVICE_FUNC
1433 static inline bool isMuchSmallerThan(
const Scalar& x,
const OtherScalar& y,
const RealScalar& prec)
1435 return numext::abs2(x) <= numext::abs2(y) * prec * prec;
1438 static inline bool isApprox(
const Scalar& x,
const Scalar& y,
const RealScalar& prec)
1440 return numext::abs2(x - y) <= numext::mini(numext::abs2(x), numext::abs2(y)) * prec * prec;
1444template<
typename Scalar>
1445struct scalar_fuzzy_impl : scalar_fuzzy_default_impl<Scalar, NumTraits<Scalar>::IsComplex, NumTraits<Scalar>::IsInteger> {};
1447template<
typename Scalar,
typename OtherScalar> EIGEN_DEVICE_FUNC
1448inline bool isMuchSmallerThan(
const Scalar& x,
const OtherScalar& y,
1449 const typename NumTraits<Scalar>::Real &precision = NumTraits<Scalar>::dummy_precision())
1451 return scalar_fuzzy_impl<Scalar>::template isMuchSmallerThan<OtherScalar>(x, y, precision);
1454template<
typename Scalar> EIGEN_DEVICE_FUNC
1455inline bool isApprox(
const Scalar& x,
const Scalar& y,
1456 const typename NumTraits<Scalar>::Real &precision = NumTraits<Scalar>::dummy_precision())
1458 return scalar_fuzzy_impl<Scalar>::isApprox(x, y, precision);
1461template<
typename Scalar> EIGEN_DEVICE_FUNC
1462inline bool isApproxOrLessThan(
const Scalar& x,
const Scalar& y,
1463 const typename NumTraits<Scalar>::Real &precision = NumTraits<Scalar>::dummy_precision())
1465 return scalar_fuzzy_impl<Scalar>::isApproxOrLessThan(x, y, precision);
1472template<>
struct random_impl<bool>
1474 static inline bool run()
1476 return random<int>(0,1)==0 ? false :
true;
1480template<>
struct scalar_fuzzy_impl<bool>
1482 typedef bool RealScalar;
1484 template<
typename OtherScalar> EIGEN_DEVICE_FUNC
1485 static inline bool isMuchSmallerThan(
const bool& x,
const bool&,
const bool&)
1491 static inline bool isApprox(
bool x,
bool y,
bool)
1497 static inline bool isApproxOrLessThan(
const bool& x,
const bool& y,
const bool&)
const CwiseBinaryOp< internal::scalar_pow_op< Derived::Scalar, ScalarExponent >, Derived, Constant< ScalarExponent > > pow(const Eigen::ArrayBase< Derived > &x, const ScalarExponent &exponent)
Namespace containing all symbols from the Eigen library.
Definition A05_PortingFrom2To3.dox:1
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_abs_op< typename Derived::Scalar >, const Derived > abs(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)