10 #ifndef EIGEN_MATHFUNCTIONS_H
11 #define EIGEN_MATHFUNCTIONS_H
15 #define EIGEN_PI 3.141592653589793238462643383279502884197169399375105820974944592307816406L
16 #define EIGEN_LOG2E 1.442695040888963407359924681001892137426645954152985934135449406931109219L
17 #define EIGEN_LN2 0.693147180559945309417232121458176568075500134360255254120680009493393621L
23 #if EIGEN_OS_WINCE && EIGEN_COMP_MSVC && EIGEN_COMP_MSVC<=1500
24 long abs(
long x) {
return (labs(x)); }
25 double abs(
double x) {
return (fabs(x)); }
26 float abs(
float x) {
return (fabsf(x)); }
27 long double abs(
long double x) {
return (fabsl(x)); }
52 template<
typename T,
typename dummy =
void>
58 template<
typename T>
struct always_void {
typedef void type; };
63 typename
always_void<typename T::Eigen_BaseClassForSpecializationOfGlobalMathFuncImpl>::type
66 typedef typename T::Eigen_BaseClassForSpecializationOfGlobalMathFuncImpl type;
69 #define EIGEN_MATHFUNC_IMPL(func, scalar) Eigen::internal::func##_impl<typename Eigen::internal::global_math_functions_filtering_base<scalar>::type>
70 #define EIGEN_MATHFUNC_RETVAL(func, scalar) typename Eigen::internal::func##_retval<typename Eigen::internal::global_math_functions_filtering_base<scalar>::type>::type
76 template<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
81 static inline RealScalar run(
const Scalar& x)
87 template<
typename Scalar>
92 static inline RealScalar run(
const Scalar& x)
101 #if defined(EIGEN_GPU_COMPILE_PHASE)
105 typedef T RealScalar;
107 static inline T run(
const std::complex<T>& x)
114 template<
typename Scalar>
124 template<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
129 static inline RealScalar run(
const Scalar&)
131 return RealScalar(0);
135 template<
typename Scalar>
140 static inline RealScalar run(
const Scalar& x)
149 #if defined(EIGEN_GPU_COMPILE_PHASE)
153 typedef T RealScalar;
155 static inline T run(
const std::complex<T>& x)
162 template<
typename Scalar>
172 template<
typename Scalar>
177 static inline RealScalar& run(Scalar& x)
179 return reinterpret_cast<RealScalar*
>(&x)[0];
182 static inline const RealScalar& run(
const Scalar& x)
184 return reinterpret_cast<const RealScalar*
>(&x)[0];
188 template<
typename Scalar>
198 template<
typename Scalar,
bool IsComplex>
203 static inline RealScalar& run(Scalar& x)
205 return reinterpret_cast<RealScalar*
>(&x)[1];
208 static inline const RealScalar& run(
const Scalar& x)
210 return reinterpret_cast<RealScalar*
>(&x)[1];
214 template<
typename Scalar>
218 static inline Scalar run(Scalar&)
223 static inline const Scalar run(
const Scalar&)
229 template<
typename Scalar>
232 template<
typename Scalar>
242 template<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
246 static inline Scalar run(
const Scalar& x)
252 template<
typename Scalar>
256 static inline Scalar run(
const Scalar& x)
265 #if defined(EIGEN_GPU_COMPILE_PHASE)
270 static inline std::complex<T> run(
const std::complex<T>& x)
272 return std::complex<T>(x.real(), -x.imag());
277 template<
typename Scalar>
287 template<
typename Scalar,
bool IsComplex>
292 static inline RealScalar run(
const Scalar& x)
298 template<
typename Scalar>
303 static inline RealScalar run(
const Scalar& x)
305 return x.real()*x.real() + x.imag()*x.imag();
309 template<
typename Scalar>
314 static inline RealScalar run(
const Scalar& x)
320 template<
typename Scalar>
330 template<
typename Scalar,
bool IsComplex>
333 template<
typename Scalar>
338 static inline RealScalar run(
const Scalar& x)
340 EIGEN_USING_STD(abs);
341 return abs(x.real()) + abs(x.imag());
345 template<
typename Scalar>
349 static inline Scalar run(
const Scalar& x)
351 EIGEN_USING_STD(abs);
356 template<
typename Scalar>
359 template<
typename Scalar>
371 template<
typename Scalar>
381 template<
typename OldType,
typename NewType,
typename EnableIf =
void>
385 static inline NewType run(
const OldType& x)
387 return static_cast<NewType
>(x);
393 template<
typename OldType,
typename NewType>
396 !NumTraits<OldType>::IsComplex && NumTraits<NewType>::IsComplex
400 static inline NewType run(
const OldType& x)
402 typedef typename NumTraits<NewType>::Real NewReal;
403 return static_cast<NewType
>(
static_cast<NewReal
>(x));
409 template<
typename OldType,
typename NewType>
411 inline NewType cast(
const OldType& x)
420 #if EIGEN_HAS_CXX11_MATH
421 template<
typename Scalar>
424 static inline Scalar run(
const Scalar& x)
427 EIGEN_USING_STD(round);
428 return Scalar(round(x));
432 template<
typename Scalar>
436 static inline Scalar run(
const Scalar& x)
439 EIGEN_USING_STD(floor);
440 EIGEN_USING_STD(ceil);
441 return (x > Scalar(0)) ? floor(x + Scalar(0.5)) : ceil(x - Scalar(0.5));
446 template<
typename Scalar>
456 template<
typename Scalar>
459 static inline Scalar run(
const Scalar& x)
462 #if EIGEN_HAS_CXX11_MATH
463 EIGEN_USING_STD(rint);
469 #if !EIGEN_HAS_CXX11_MATH
473 static inline double run(
const double& x)
481 static inline float run(
const float& x)
488 template<
typename Scalar>
498 #if EIGEN_HAS_CXX11_MATH
499 template<
typename Scalar>
502 static inline Scalar run(
const Scalar& x)
504 #if defined(EIGEN_HIP_DEVICE_COMPILE)
508 EIGEN_USING_STD(arg);
514 template<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
519 static inline RealScalar run(
const Scalar& x)
521 return (x < Scalar(0)) ? Scalar(EIGEN_PI) : Scalar(0); }
524 template<
typename Scalar>
529 static inline RealScalar run(
const Scalar& x)
531 EIGEN_USING_STD(arg);
539 template<
typename Scalar>
550 namespace std_fallback {
554 template<
typename Scalar>
555 EIGEN_DEVICE_FUNC
inline Scalar expm1(
const Scalar& x) {
556 EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
559 EIGEN_USING_STD(exp);
561 if (numext::equal_strict(u, Scalar(1))) {
564 Scalar um1 = u - RealScalar(1);
565 if (numext::equal_strict(um1, Scalar(-1))) {
566 return RealScalar(-1);
569 EIGEN_USING_STD(log);
570 Scalar logu = log(u);
571 return numext::equal_strict(u, logu) ? u : (u - RealScalar(1)) * x / logu;
575 template<
typename Scalar>
577 EIGEN_DEVICE_FUNC
static inline Scalar run(
const Scalar& x)
579 EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
580 #if EIGEN_HAS_CXX11_MATH
583 using std_fallback::expm1;
590 template <
typename RealScalar>
592 EIGEN_DEVICE_FUNC
static inline std::complex<RealScalar> run(
593 const std::complex<RealScalar>& x) {
594 EIGEN_STATIC_ASSERT_NON_INTEGER(RealScalar)
595 RealScalar xr = x.real();
596 RealScalar xi = x.imag();
609 RealScalar er = erm1 + RealScalar(1.);
610 EIGEN_USING_STD(sin);
611 RealScalar sin2 = sin(xi / RealScalar(2.));
613 RealScalar s = sin(xi);
614 RealScalar real_part = erm1 - RealScalar(2.) * er * sin2;
615 return std::complex<RealScalar>(real_part, er * s);
619 template<
typename Scalar>
629 namespace std_fallback {
632 template<
typename Scalar>
633 EIGEN_DEVICE_FUNC
inline Scalar log1p(
const Scalar& x) {
634 EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
636 EIGEN_USING_STD(log);
637 Scalar x1p = RealScalar(1) + x;
638 Scalar log_1p = log(x1p);
639 const bool is_small = numext::equal_strict(x1p, Scalar(1));
640 const bool is_inf = numext::equal_strict(x1p, log_1p);
641 return (is_small || is_inf) ? x : x * (log_1p / (x1p - RealScalar(1)));
645 template<
typename Scalar>
647 EIGEN_DEVICE_FUNC
static inline Scalar run(
const Scalar& x)
649 EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
650 #if EIGEN_HAS_CXX11_MATH
653 using std_fallback::log1p;
660 template <
typename RealScalar>
662 EIGEN_DEVICE_FUNC
static inline std::complex<RealScalar> run(
663 const std::complex<RealScalar>& x) {
664 EIGEN_STATIC_ASSERT_NON_INTEGER(RealScalar)
665 return std_fallback::log1p(x);
669 template<
typename Scalar>
684 static EIGEN_DEVICE_FUNC
inline result_type run(
const ScalarX& x,
const ScalarY& y)
686 EIGEN_USING_STD(pow);
691 template<
typename ScalarX,
typename ScalarY>
694 typedef ScalarX result_type;
695 static EIGEN_DEVICE_FUNC
inline ScalarX run(ScalarX x, ScalarY y)
715 template<
typename Scalar,
720 template<
typename Scalar>
723 template<
typename Scalar>
729 template<
typename Scalar>
inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random(
const Scalar& x,
const Scalar& y);
730 template<
typename Scalar>
inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random();
732 template<
typename Scalar>
735 static inline Scalar run(
const Scalar& x,
const Scalar& y)
737 return x + (y-x) * Scalar(std::rand()) / Scalar(RAND_MAX);
739 static inline Scalar run()
746 meta_floor_log2_terminate,
747 meta_floor_log2_move_up,
748 meta_floor_log2_move_down,
749 meta_floor_log2_bogus
754 enum { middle = (lower + upper) / 2,
755 value = (upper <= lower + 1) ? int(meta_floor_log2_terminate)
756 : (n < (1 << middle)) ? int(meta_floor_log2_move_down)
757 : (n==0) ?
int(meta_floor_log2_bogus)
758 : int(meta_floor_log2_move_up)
762 template<
unsigned int n,
764 int upper =
sizeof(
unsigned int) * CHAR_BIT - 1,
768 template<
unsigned int n,
int lower,
int upper>
774 template<
unsigned int n,
int lower,
int upper>
780 template<
unsigned int n,
int lower,
int upper>
783 enum { value = (n >= ((
unsigned int)(1) << (lower+1))) ? lower+1 : lower };
786 template<
unsigned int n,
int lower,
int upper>
792 template<
typename Scalar>
795 static inline Scalar run(
const Scalar& x,
const Scalar& y)
804 typedef typename conditional<(ScalarU(-1) > unsigned(-1)), ScalarU,
unsigned>::type ScalarX;
808 ScalarX range = ScalarX(y) - ScalarX(x);
811 ScalarX multiplier = 1;
812 const unsigned rand_max = RAND_MAX;
813 if (range <= rand_max) divisor = (rand_max + 1) / (range + 1);
814 else multiplier = 1 + range / (rand_max + 1);
817 offset = (unsigned(std::rand()) * multiplier) / divisor;
818 }
while (offset > range);
819 return Scalar(ScalarX(x) + offset);
822 static inline Scalar run()
824 #ifdef EIGEN_MAKING_DOCS
828 scalar_bits =
sizeof(Scalar) * CHAR_BIT,
829 shift = EIGEN_PLAIN_ENUM_MAX(0,
int(rand_bits) - int(scalar_bits)),
832 return Scalar((std::rand() >> shift) - offset);
837 template<
typename Scalar>
840 static inline Scalar run(
const Scalar& x,
const Scalar& y)
842 return Scalar(random(x.real(), y.real()),
843 random(x.imag(), y.imag()));
845 static inline Scalar run()
848 return Scalar(random<RealScalar>(), random<RealScalar>());
852 template<
typename Scalar>
853 inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random(
const Scalar& x,
const Scalar& y)
855 return EIGEN_MATHFUNC_IMPL(random, Scalar)::run(x, y);
858 template<
typename Scalar>
859 inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random()
861 return EIGEN_MATHFUNC_IMPL(random, Scalar)::run();
867 #if (EIGEN_HAS_CXX11_MATH && !(EIGEN_COMP_GNUC_STRICT && __FINITE_MATH_ONLY__)) || (EIGEN_COMP_MSVC>=1800) || (EIGEN_COMP_CLANG)
868 #define EIGEN_USE_STD_FPCLASSIFY 1
870 #define EIGEN_USE_STD_FPCLASSIFY 0
875 typename internal::enable_if<internal::is_integral<T>::value,
bool>::type
876 isnan_impl(
const T&) {
return false; }
880 typename internal::enable_if<internal::is_integral<T>::value,
bool>::type
881 isinf_impl(
const T&) {
return false; }
885 typename internal::enable_if<internal::is_integral<T>::value,
bool>::type
886 isfinite_impl(
const T&) {
return true; }
890 typename internal::enable_if<(!internal::is_integral<T>::value)&&(!NumTraits<T>::IsComplex),
bool>::type
891 isfinite_impl(
const T& x)
893 #if defined(EIGEN_GPU_COMPILE_PHASE)
894 return (::isfinite)(x);
895 #elif EIGEN_USE_STD_FPCLASSIFY
897 return isfinite EIGEN_NOT_A_MACRO (x);
899 return x<=NumTraits<T>::highest() && x>=NumTraits<T>::lowest();
905 typename internal::enable_if<(!internal::is_integral<T>::value)&&(!NumTraits<T>::IsComplex),
bool>::type
906 isinf_impl(
const T& x)
908 #if defined(EIGEN_GPU_COMPILE_PHASE)
910 #elif EIGEN_USE_STD_FPCLASSIFY
912 return isinf EIGEN_NOT_A_MACRO (x);
914 return x>NumTraits<T>::highest() || x<NumTraits<T>::lowest();
920 typename internal::enable_if<(!internal::is_integral<T>::value)&&(!NumTraits<T>::IsComplex),
bool>::type
921 isnan_impl(
const T& x)
923 #if defined(EIGEN_GPU_COMPILE_PHASE)
925 #elif EIGEN_USE_STD_FPCLASSIFY
927 return isnan EIGEN_NOT_A_MACRO (x);
933 #if (!EIGEN_USE_STD_FPCLASSIFY)
937 template<
typename T> EIGEN_DEVICE_FUNC
bool isinf_msvc_helper(T x)
939 return _fpclass(x)==_FPCLASS_NINF || _fpclass(x)==_FPCLASS_PINF;
943 EIGEN_DEVICE_FUNC
inline bool isnan_impl(
const long double& x) {
return _isnan(x)!=0; }
944 EIGEN_DEVICE_FUNC
inline bool isnan_impl(
const double& x) {
return _isnan(x)!=0; }
945 EIGEN_DEVICE_FUNC
inline bool isnan_impl(
const float& x) {
return _isnan(x)!=0; }
947 EIGEN_DEVICE_FUNC
inline bool isinf_impl(
const long double& x) {
return isinf_msvc_helper(x); }
948 EIGEN_DEVICE_FUNC
inline bool isinf_impl(
const double& x) {
return isinf_msvc_helper(x); }
949 EIGEN_DEVICE_FUNC
inline bool isinf_impl(
const float& x) {
return isinf_msvc_helper(x); }
951 #elif (defined __FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ && EIGEN_COMP_GNUC)
953 #if EIGEN_GNUC_AT_LEAST(5,0)
954 #define EIGEN_TMP_NOOPT_ATTRIB EIGEN_DEVICE_FUNC inline __attribute__((optimize("no-finite-math-only")))
958 #define EIGEN_TMP_NOOPT_ATTRIB EIGEN_DEVICE_FUNC inline __attribute__((noinline,optimize("no-finite-math-only")))
961 template<> EIGEN_TMP_NOOPT_ATTRIB
bool isnan_impl(
const long double& x) {
return __builtin_isnan(x); }
962 template<> EIGEN_TMP_NOOPT_ATTRIB
bool isnan_impl(
const double& x) {
return __builtin_isnan(x); }
963 template<> EIGEN_TMP_NOOPT_ATTRIB
bool isnan_impl(
const float& x) {
return __builtin_isnan(x); }
964 template<> EIGEN_TMP_NOOPT_ATTRIB
bool isinf_impl(
const double& x) {
return __builtin_isinf(x); }
965 template<> EIGEN_TMP_NOOPT_ATTRIB
bool isinf_impl(
const float& x) {
return __builtin_isinf(x); }
966 template<> EIGEN_TMP_NOOPT_ATTRIB
bool isinf_impl(
const long double& x) {
return __builtin_isinf(x); }
968 #undef EIGEN_TMP_NOOPT_ATTRIB
975 template<
typename T> EIGEN_DEVICE_FUNC
bool isfinite_impl(
const std::complex<T>& x);
976 template<
typename T> EIGEN_DEVICE_FUNC
bool isnan_impl(
const std::complex<T>& x);
977 template<
typename T> EIGEN_DEVICE_FUNC
bool isinf_impl(
const std::complex<T>& x);
979 template<
typename T> T generic_fast_tanh_float(
const T& a_x);
988 #if (!defined(EIGEN_GPUCC) || defined(EIGEN_CONSTEXPR_ARE_DEVICE_FUNC))
991 EIGEN_ALWAYS_INLINE T mini(
const T& x,
const T& y)
994 return min EIGEN_NOT_A_MACRO (x,y);
999 EIGEN_ALWAYS_INLINE T maxi(
const T& x,
const T& y)
1001 EIGEN_USING_STD(max)
1002 return max EIGEN_NOT_A_MACRO (x,y);
1005 template<
typename T>
1007 EIGEN_ALWAYS_INLINE T mini(
const T& x,
const T& y)
1009 return y < x ? y : x;
1013 EIGEN_ALWAYS_INLINE
float mini(
const float& x,
const float& y)
1019 EIGEN_ALWAYS_INLINE
double mini(
const double& x,
const double& y)
1025 EIGEN_ALWAYS_INLINE
long double mini(
const long double& x,
const long double& y)
1027 #if defined(EIGEN_HIPCC)
1029 return (x < y) ? x : y;
1035 template<
typename T>
1037 EIGEN_ALWAYS_INLINE T maxi(
const T& x,
const T& y)
1039 return x < y ? y : x;
1043 EIGEN_ALWAYS_INLINE
float maxi(
const float& x,
const float& y)
1049 EIGEN_ALWAYS_INLINE
double maxi(
const double& x,
const double& y)
1055 EIGEN_ALWAYS_INLINE
long double maxi(
const long double& x,
const long double& y)
1057 #if defined(EIGEN_HIPCC)
1059 return (x > y) ? x : y;
1066 #if defined(SYCL_DEVICE_ONLY)
1069 #define SYCL_SPECIALIZE_SIGNED_INTEGER_TYPES_BINARY(NAME, FUNC) \
1070 SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_char) \
1071 SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_short) \
1072 SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_int) \
1073 SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_long)
1074 #define SYCL_SPECIALIZE_SIGNED_INTEGER_TYPES_UNARY(NAME, FUNC) \
1075 SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_char) \
1076 SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_short) \
1077 SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_int) \
1078 SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_long)
1079 #define SYCL_SPECIALIZE_UNSIGNED_INTEGER_TYPES_BINARY(NAME, FUNC) \
1080 SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_uchar) \
1081 SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_ushort) \
1082 SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_uint) \
1083 SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_ulong)
1084 #define SYCL_SPECIALIZE_UNSIGNED_INTEGER_TYPES_UNARY(NAME, FUNC) \
1085 SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_uchar) \
1086 SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_ushort) \
1087 SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_uint) \
1088 SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_ulong)
1089 #define SYCL_SPECIALIZE_INTEGER_TYPES_BINARY(NAME, FUNC) \
1090 SYCL_SPECIALIZE_SIGNED_INTEGER_TYPES_BINARY(NAME, FUNC) \
1091 SYCL_SPECIALIZE_UNSIGNED_INTEGER_TYPES_BINARY(NAME, FUNC)
1092 #define SYCL_SPECIALIZE_INTEGER_TYPES_UNARY(NAME, FUNC) \
1093 SYCL_SPECIALIZE_SIGNED_INTEGER_TYPES_UNARY(NAME, FUNC) \
1094 SYCL_SPECIALIZE_UNSIGNED_INTEGER_TYPES_UNARY(NAME, FUNC)
1095 #define SYCL_SPECIALIZE_FLOATING_TYPES_BINARY(NAME, FUNC) \
1096 SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, cl::sycl::cl_float) \
1097 SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC,cl::sycl::cl_double)
1098 #define SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(NAME, FUNC) \
1099 SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, cl::sycl::cl_float) \
1100 SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC,cl::sycl::cl_double)
1101 #define SYCL_SPECIALIZE_FLOATING_TYPES_UNARY_FUNC_RET_TYPE(NAME, FUNC, RET_TYPE) \
1102 SYCL_SPECIALIZE_GEN_UNARY_FUNC(NAME, FUNC, RET_TYPE, cl::sycl::cl_float) \
1103 SYCL_SPECIALIZE_GEN_UNARY_FUNC(NAME, FUNC, RET_TYPE, cl::sycl::cl_double)
1105 #define SYCL_SPECIALIZE_GEN_UNARY_FUNC(NAME, FUNC, RET_TYPE, ARG_TYPE) \
1108 EIGEN_ALWAYS_INLINE RET_TYPE NAME(const ARG_TYPE& x) { \
1109 return cl::sycl::FUNC(x); \
1112 #define SYCL_SPECIALIZE_UNARY_FUNC(NAME, FUNC, TYPE) \
1113 SYCL_SPECIALIZE_GEN_UNARY_FUNC(NAME, FUNC, TYPE, TYPE)
1115 #define SYCL_SPECIALIZE_GEN1_BINARY_FUNC(NAME, FUNC, RET_TYPE, ARG_TYPE1, ARG_TYPE2) \
1118 EIGEN_ALWAYS_INLINE RET_TYPE NAME(const ARG_TYPE1& x, const ARG_TYPE2& y) { \
1119 return cl::sycl::FUNC(x, y); \
1122 #define SYCL_SPECIALIZE_GEN2_BINARY_FUNC(NAME, FUNC, RET_TYPE, ARG_TYPE) \
1123 SYCL_SPECIALIZE_GEN1_BINARY_FUNC(NAME, FUNC, RET_TYPE, ARG_TYPE, ARG_TYPE)
1125 #define SYCL_SPECIALIZE_BINARY_FUNC(NAME, FUNC, TYPE) \
1126 SYCL_SPECIALIZE_GEN2_BINARY_FUNC(NAME, FUNC, TYPE, TYPE)
1128 SYCL_SPECIALIZE_INTEGER_TYPES_BINARY(mini, min)
1129 SYCL_SPECIALIZE_FLOATING_TYPES_BINARY(mini, fmin)
1130 SYCL_SPECIALIZE_INTEGER_TYPES_BINARY(maxi, max)
1131 SYCL_SPECIALIZE_FLOATING_TYPES_BINARY(maxi, fmax)
1136 template<
typename Scalar>
1138 inline EIGEN_MATHFUNC_RETVAL(real, Scalar) real(
const Scalar& x)
1140 return EIGEN_MATHFUNC_IMPL(real, Scalar)::run(x);
1143 template<
typename Scalar>
1145 inline typename internal::add_const_on_value_type< EIGEN_MATHFUNC_RETVAL(real_ref, Scalar) >::type real_ref(
const Scalar& x)
1147 return internal::real_ref_impl<Scalar>::run(x);
1150 template<
typename Scalar>
1152 inline EIGEN_MATHFUNC_RETVAL(real_ref, Scalar) real_ref(Scalar& x)
1154 return EIGEN_MATHFUNC_IMPL(real_ref, Scalar)::run(x);
1157 template<
typename Scalar>
1159 inline EIGEN_MATHFUNC_RETVAL(imag, Scalar) imag(
const Scalar& x)
1161 return EIGEN_MATHFUNC_IMPL(imag, Scalar)::run(x);
1164 template<
typename Scalar>
1166 inline EIGEN_MATHFUNC_RETVAL(arg, Scalar) arg(
const Scalar& x)
1168 return EIGEN_MATHFUNC_IMPL(arg, Scalar)::run(x);
1171 template<
typename Scalar>
1173 inline typename internal::add_const_on_value_type< EIGEN_MATHFUNC_RETVAL(imag_ref, Scalar) >::type imag_ref(
const Scalar& x)
1175 return internal::imag_ref_impl<Scalar>::run(x);
1178 template<
typename Scalar>
1180 inline EIGEN_MATHFUNC_RETVAL(imag_ref, Scalar) imag_ref(Scalar& x)
1182 return EIGEN_MATHFUNC_IMPL(imag_ref, Scalar)::run(x);
1185 template<
typename Scalar>
1187 inline EIGEN_MATHFUNC_RETVAL(conj, Scalar) conj(
const Scalar& x)
1189 return EIGEN_MATHFUNC_IMPL(conj, Scalar)::run(x);
1192 template<
typename Scalar>
1194 inline EIGEN_MATHFUNC_RETVAL(abs2, Scalar) abs2(
const Scalar& x)
1196 return EIGEN_MATHFUNC_IMPL(abs2, Scalar)::run(x);
1200 inline bool abs2(
bool x) {
return x; }
1202 template<
typename T>
1204 EIGEN_ALWAYS_INLINE T absdiff(
const T& x,
const T& y)
1206 return x > y ? x - y : y - x;
1210 EIGEN_ALWAYS_INLINE
float absdiff(
const float& x,
const float& y)
1212 return fabsf(x - y);
1216 EIGEN_ALWAYS_INLINE
double absdiff(
const double& x,
const double& y)
1221 #if !defined(EIGEN_GPUCC)
1225 EIGEN_ALWAYS_INLINE
long double absdiff(
const long double& x,
const long double& y) {
1226 return fabsl(x - y);
1230 template<
typename Scalar>
1232 inline EIGEN_MATHFUNC_RETVAL(norm1, Scalar) norm1(
const Scalar& x)
1234 return EIGEN_MATHFUNC_IMPL(norm1, Scalar)::run(x);
1237 template<
typename Scalar>
1239 inline EIGEN_MATHFUNC_RETVAL(hypot, Scalar) hypot(
const Scalar& x,
const Scalar& y)
1241 return EIGEN_MATHFUNC_IMPL(hypot, Scalar)::run(x, y);
1244 #if defined(SYCL_DEVICE_ONLY)
1245 SYCL_SPECIALIZE_FLOATING_TYPES_BINARY(hypot, hypot)
1248 template<
typename Scalar>
1250 inline EIGEN_MATHFUNC_RETVAL(log1p, Scalar) log1p(
const Scalar& x)
1252 return EIGEN_MATHFUNC_IMPL(log1p, Scalar)::run(x);
1255 #if defined(SYCL_DEVICE_ONLY)
1256 SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(log1p, log1p)
1259 #if defined(EIGEN_GPUCC)
1260 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1261 float log1p(
const float &x) { return ::log1pf(x); }
1263 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1264 double log1p(
const double &x) { return ::log1p(x); }
1267 template<
typename ScalarX,
typename ScalarY>
1269 inline typename internal::pow_impl<ScalarX,ScalarY>::result_type pow(
const ScalarX& x,
const ScalarY& y)
1271 return internal::pow_impl<ScalarX,ScalarY>::run(x, y);
1274 #if defined(SYCL_DEVICE_ONLY)
1275 SYCL_SPECIALIZE_FLOATING_TYPES_BINARY(pow, pow)
1278 template<
typename T> EIGEN_DEVICE_FUNC bool (isnan) (
const T &x) {
return internal::isnan_impl(x); }
1279 template<
typename T> EIGEN_DEVICE_FUNC bool (isinf) (
const T &x) {
return internal::isinf_impl(x); }
1280 template<
typename T> EIGEN_DEVICE_FUNC bool (isfinite)(
const T &x) {
return internal::isfinite_impl(x); }
1282 #if defined(SYCL_DEVICE_ONLY)
1283 SYCL_SPECIALIZE_FLOATING_TYPES_UNARY_FUNC_RET_TYPE(isnan, isnan,
bool)
1284 SYCL_SPECIALIZE_FLOATING_TYPES_UNARY_FUNC_RET_TYPE(isinf, isinf,
bool)
1285 SYCL_SPECIALIZE_FLOATING_TYPES_UNARY_FUNC_RET_TYPE(isfinite, isfinite,
bool)
1288 template<
typename Scalar>
1290 inline EIGEN_MATHFUNC_RETVAL(rint, Scalar) rint(
const Scalar& x)
1292 return EIGEN_MATHFUNC_IMPL(rint, Scalar)::run(x);
1295 template<
typename Scalar>
1297 inline EIGEN_MATHFUNC_RETVAL(round, Scalar) round(
const Scalar& x)
1299 return EIGEN_MATHFUNC_IMPL(round, Scalar)::run(x);
1302 #if defined(SYCL_DEVICE_ONLY)
1303 SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(round, round)
1306 template<
typename T>
1308 T (floor)(
const T& x)
1310 EIGEN_USING_STD(floor)
1314 #if defined(SYCL_DEVICE_ONLY)
1315 SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(floor, floor)
1318 #if defined(EIGEN_GPUCC)
1319 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1320 float floor(
const float &x) { return ::floorf(x); }
1322 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1323 double floor(
const double &x) { return ::floor(x); }
1326 template<
typename T>
1328 T (ceil)(
const T& x)
1330 EIGEN_USING_STD(ceil);
1334 #if defined(SYCL_DEVICE_ONLY)
1335 SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(ceil, ceil)
1338 #if defined(EIGEN_GPUCC)
1339 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1340 float ceil(
const float &x) { return ::ceilf(x); }
1342 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1343 double ceil(
const double &x) { return ::ceil(x); }
1349 inline int log2(
int x)
1353 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 };
1359 return table[(v * 0x07C4ACDDU) >> 27];
1371 template<
typename T>
1372 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1375 EIGEN_USING_STD(sqrt);
1381 EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_DEVICE_FUNC
1382 bool sqrt<bool>(
const bool &x) {
return x; }
1384 #if defined(SYCL_DEVICE_ONLY)
1385 SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(sqrt, sqrt)
1388 template<
typename T>
1389 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1391 EIGEN_USING_STD(log);
1395 #if defined(SYCL_DEVICE_ONLY)
1396 SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(log, log)
1400 #if defined(EIGEN_GPUCC)
1401 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1402 float log(
const float &x) { return ::logf(x); }
1404 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1405 double log(
const double &x) { return ::log(x); }
1408 template<
typename T>
1409 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1410 typename internal::enable_if<NumTraits<T>::IsSigned || NumTraits<T>::IsComplex,
typename NumTraits<T>::Real>::type
1412 EIGEN_USING_STD(abs);
1416 template<
typename T>
1417 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1418 typename internal::enable_if<!(NumTraits<T>::IsSigned || NumTraits<T>::IsComplex),
typename NumTraits<T>::Real>::type
1423 #if defined(SYCL_DEVICE_ONLY)
1424 SYCL_SPECIALIZE_INTEGER_TYPES_UNARY(abs, abs)
1425 SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(abs, fabs)
1428 #if defined(EIGEN_GPUCC)
1429 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1430 float abs(
const float &x) { return ::fabsf(x); }
1432 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1433 double abs(
const double &x) { return ::fabs(x); }
1435 template <> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1436 float abs(
const std::complex<float>& x) {
1437 return ::hypotf(x.real(), x.imag());
1440 template <> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1441 double abs(
const std::complex<double>& x) {
1442 return ::hypot(x.real(), x.imag());
1446 template<
typename T>
1447 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1449 EIGEN_USING_STD(exp);
1453 #if defined(SYCL_DEVICE_ONLY)
1454 SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(exp, exp)
1457 #if defined(EIGEN_GPUCC)
1458 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1459 float exp(
const float &x) { return ::expf(x); }
1461 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1462 double exp(
const double &x) { return ::exp(x); }
1464 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1465 std::complex<float> exp(
const std::complex<float>& x) {
1466 float com = ::expf(x.real());
1467 float res_real = com * ::cosf(x.imag());
1468 float res_imag = com * ::sinf(x.imag());
1469 return std::complex<float>(res_real, res_imag);
1472 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1473 std::complex<double> exp(
const std::complex<double>& x) {
1474 double com = ::exp(x.real());
1475 double res_real = com * ::cos(x.imag());
1476 double res_imag = com * ::sin(x.imag());
1477 return std::complex<double>(res_real, res_imag);
1481 template<
typename Scalar>
1483 inline EIGEN_MATHFUNC_RETVAL(expm1, Scalar) expm1(
const Scalar& x)
1485 return EIGEN_MATHFUNC_IMPL(expm1, Scalar)::run(x);
1488 #if defined(SYCL_DEVICE_ONLY)
1489 SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(expm1, expm1)
1492 #if defined(EIGEN_GPUCC)
1493 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1494 float expm1(
const float &x) { return ::expm1f(x); }
1496 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1497 double expm1(
const double &x) { return ::expm1(x); }
1500 template<
typename T>
1501 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1503 EIGEN_USING_STD(cos);
1507 #if defined(SYCL_DEVICE_ONLY)
1508 SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(cos,cos)
1511 #if defined(EIGEN_GPUCC)
1512 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1513 float cos(
const float &x) { return ::cosf(x); }
1515 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1516 double cos(
const double &x) { return ::cos(x); }
1519 template<
typename T>
1520 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1522 EIGEN_USING_STD(sin);
1526 #if defined(SYCL_DEVICE_ONLY)
1527 SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(sin, sin)
1530 #if defined(EIGEN_GPUCC)
1531 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1532 float sin(
const float &x) { return ::sinf(x); }
1534 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1535 double sin(
const double &x) { return ::sin(x); }
1538 template<
typename T>
1539 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1541 EIGEN_USING_STD(tan);
1545 #if defined(SYCL_DEVICE_ONLY)
1546 SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(tan, tan)
1549 #if defined(EIGEN_GPUCC)
1550 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1551 float tan(
const float &x) { return ::tanf(x); }
1553 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1554 double tan(
const double &x) { return ::tan(x); }
1557 template<
typename T>
1558 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1559 T acos(
const T &x) {
1560 EIGEN_USING_STD(acos);
1564 #if EIGEN_HAS_CXX11_MATH
1565 template<
typename T>
1566 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1567 T acosh(
const T &x) {
1568 EIGEN_USING_STD(acosh);
1573 #if defined(SYCL_DEVICE_ONLY)
1574 SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(acos, acos)
1575 SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(acosh, acosh)
1578 #if defined(EIGEN_GPUCC)
1579 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1580 float acos(
const float &x) { return ::acosf(x); }
1582 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1583 double acos(
const double &x) { return ::acos(x); }
1586 template<
typename T>
1587 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1588 T asin(
const T &x) {
1589 EIGEN_USING_STD(asin);
1593 #if EIGEN_HAS_CXX11_MATH
1594 template<
typename T>
1595 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1596 T asinh(
const T &x) {
1597 EIGEN_USING_STD(asinh);
1602 #if defined(SYCL_DEVICE_ONLY)
1603 SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(asin, asin)
1604 SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(asinh, asinh)
1607 #if defined(EIGEN_GPUCC)
1608 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1609 float asin(
const float &x) { return ::asinf(x); }
1611 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1612 double asin(
const double &x) { return ::asin(x); }
1615 template<
typename T>
1616 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1617 T atan(
const T &x) {
1618 EIGEN_USING_STD(atan);
1622 #if EIGEN_HAS_CXX11_MATH
1623 template<
typename T>
1624 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1625 T atanh(
const T &x) {
1626 EIGEN_USING_STD(atanh);
1631 #if defined(SYCL_DEVICE_ONLY)
1632 SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(atan, atan)
1633 SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(atanh, atanh)
1636 #if defined(EIGEN_GPUCC)
1637 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1638 float atan(
const float &x) { return ::atanf(x); }
1640 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1641 double atan(
const double &x) { return ::atan(x); }
1645 template<
typename T>
1646 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1647 T cosh(
const T &x) {
1648 EIGEN_USING_STD(cosh);
1652 #if defined(SYCL_DEVICE_ONLY)
1653 SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(cosh, cosh)
1656 #if defined(EIGEN_GPUCC)
1657 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1658 float cosh(
const float &x) { return ::coshf(x); }
1660 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1661 double cosh(
const double &x) { return ::cosh(x); }
1664 template<
typename T>
1665 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1666 T sinh(
const T &x) {
1667 EIGEN_USING_STD(sinh);
1671 #if defined(SYCL_DEVICE_ONLY)
1672 SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(sinh, sinh)
1675 #if defined(EIGEN_GPUCC)
1676 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1677 float sinh(
const float &x) { return ::sinhf(x); }
1679 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1680 double sinh(
const double &x) { return ::sinh(x); }
1683 template<
typename T>
1684 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1685 T tanh(
const T &x) {
1686 EIGEN_USING_STD(tanh);
1690 #if (!defined(EIGEN_GPUCC)) && EIGEN_FAST_MATH && !defined(SYCL_DEVICE_ONLY)
1691 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1692 float tanh(
float x) {
return internal::generic_fast_tanh_float(x); }
1695 #if defined(SYCL_DEVICE_ONLY)
1696 SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(tanh, tanh)
1699 #if defined(EIGEN_GPUCC)
1700 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1701 float tanh(
const float &x) { return ::tanhf(x); }
1703 template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1704 double tanh(
const double &x) { return ::tanh(x); }
1707 template <
typename T>
1708 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1709 T fmod(
const T& a,
const T& b) {
1710 EIGEN_USING_STD(fmod);
1714 #if defined(SYCL_DEVICE_ONLY)
1715 SYCL_SPECIALIZE_FLOATING_TYPES_BINARY(fmod, fmod)
1718 #if defined(EIGEN_GPUCC)
1720 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1721 float fmod(
const float& a,
const float& b) {
1722 return ::fmodf(a, b);
1726 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1727 double fmod(
const double& a,
const double& b) {
1728 return ::fmod(a, b);
1732 #if defined(SYCL_DEVICE_ONLY)
1733 #undef SYCL_SPECIALIZE_SIGNED_INTEGER_TYPES_BINARY
1734 #undef SYCL_SPECIALIZE_SIGNED_INTEGER_TYPES_UNARY
1735 #undef SYCL_SPECIALIZE_UNSIGNED_INTEGER_TYPES_BINARY
1736 #undef SYCL_SPECIALIZE_UNSIGNED_INTEGER_TYPES_UNARY
1737 #undef SYCL_SPECIALIZE_INTEGER_TYPES_BINARY
1738 #undef SYCL_SPECIALIZE_UNSIGNED_INTEGER_TYPES_UNARY
1739 #undef SYCL_SPECIALIZE_FLOATING_TYPES_BINARY
1740 #undef SYCL_SPECIALIZE_FLOATING_TYPES_UNARY
1741 #undef SYCL_SPECIALIZE_FLOATING_TYPES_UNARY_FUNC_RET_TYPE
1742 #undef SYCL_SPECIALIZE_GEN_UNARY_FUNC
1743 #undef SYCL_SPECIALIZE_UNARY_FUNC
1744 #undef SYCL_SPECIALIZE_GEN1_BINARY_FUNC
1745 #undef SYCL_SPECIALIZE_GEN2_BINARY_FUNC
1746 #undef SYCL_SPECIALIZE_BINARY_FUNC
1751 namespace internal {
1753 template<
typename T>
1754 EIGEN_DEVICE_FUNC
bool isfinite_impl(
const std::complex<T>& x)
1756 return (numext::isfinite)(numext::real(x)) && (numext::isfinite)(numext::imag(x));
1759 template<
typename T>
1760 EIGEN_DEVICE_FUNC
bool isnan_impl(
const std::complex<T>& x)
1762 return (numext::isnan)(numext::real(x)) || (numext::isnan)(numext::imag(x));
1765 template<
typename T>
1766 EIGEN_DEVICE_FUNC
bool isinf_impl(
const std::complex<T>& x)
1768 return ((numext::isinf)(numext::real(x)) || (numext::isinf)(numext::imag(x))) && (!(numext::isnan)(x));
1775 template<
typename Scalar,
1780 template<
typename Scalar>
1784 template<
typename OtherScalar> EIGEN_DEVICE_FUNC
1785 static inline bool isMuchSmallerThan(
const Scalar& x,
const OtherScalar& y,
const RealScalar& prec)
1787 return numext::abs(x) <= numext::abs(y) * prec;
1790 static inline bool isApprox(
const Scalar& x,
const Scalar& y,
const RealScalar& prec)
1792 return numext::abs(x - y) <= numext::mini(numext::abs(x), numext::abs(y)) * prec;
1795 static inline bool isApproxOrLessThan(
const Scalar& x,
const Scalar& y,
const RealScalar& prec)
1797 return x <= y || isApprox(x, y, prec);
1801 template<
typename Scalar>
1805 template<
typename OtherScalar> EIGEN_DEVICE_FUNC
1806 static inline bool isMuchSmallerThan(
const Scalar& x,
const Scalar&,
const RealScalar&)
1808 return x == Scalar(0);
1811 static inline bool isApprox(
const Scalar& x,
const Scalar& y,
const RealScalar&)
1816 static inline bool isApproxOrLessThan(
const Scalar& x,
const Scalar& y,
const RealScalar&)
1822 template<
typename Scalar>
1826 template<
typename OtherScalar> EIGEN_DEVICE_FUNC
1827 static inline bool isMuchSmallerThan(
const Scalar& x,
const OtherScalar& y,
const RealScalar& prec)
1829 return numext::abs2(x) <= numext::abs2(y) * prec * prec;
1832 static inline bool isApprox(
const Scalar& x,
const Scalar& y,
const RealScalar& prec)
1834 return numext::abs2(x - y) <= numext::mini(numext::abs2(x), numext::abs2(y)) * prec * prec;
1838 template<
typename Scalar>
1841 template<
typename Scalar,
typename OtherScalar> EIGEN_DEVICE_FUNC
1842 inline bool isMuchSmallerThan(
const Scalar& x,
const OtherScalar& y,
1848 template<
typename Scalar> EIGEN_DEVICE_FUNC
1849 inline bool isApprox(
const Scalar& x,
const Scalar& y,
1852 return scalar_fuzzy_impl<Scalar>::isApprox(x, y, precision);
1855 template<
typename Scalar> EIGEN_DEVICE_FUNC
1856 inline bool isApproxOrLessThan(
const Scalar& x,
const Scalar& y,
1857 const typename NumTraits<Scalar>::Real &precision = NumTraits<Scalar>::dummy_precision())
1859 return scalar_fuzzy_impl<Scalar>::isApproxOrLessThan(x, y, precision);
1868 static inline bool run()
1870 return random<int>(0,1)==0 ? false :
true;
1873 static inline bool run(
const bool& a,
const bool& b)
1875 return random<int>(a, b)==0 ? false :
true;
1881 typedef bool RealScalar;
1883 template<
typename OtherScalar> EIGEN_DEVICE_FUNC
1884 static inline bool isMuchSmallerThan(
const bool& x,
const bool&,
const bool&)
1890 static inline bool isApprox(
bool x,
bool y,
bool)
1896 static inline bool isApproxOrLessThan(
const bool& x,
const bool& y,
const bool&)
1908 #endif // EIGEN_MATHFUNCTIONS_H