10 #ifndef EIGEN_MATHFUNCTIONS_H 11 #define EIGEN_MATHFUNCTIONS_H 14 #define EIGEN_PI 3.141592653589793238462643383279502884197169399375105820974944592307816406 20 #if EIGEN_OS_WINCE && EIGEN_COMP_MSVC && EIGEN_COMP_MSVC<=1500 21 long abs(
long x) {
return (labs(x)); }
22 double abs(
double x) {
return (fabs(x)); }
23 float abs(
float x) {
return (fabsf(x)); }
24 long double abs(
long double x) {
return (fabsl(x)); }
49 template<
typename T,
typename dummy =
void>
50 struct global_math_functions_filtering_base
55 template<
typename T>
struct always_void {
typedef void type; };
58 struct global_math_functions_filtering_base
60 typename always_void<typename T::Eigen_BaseClassForSpecializationOfGlobalMathFuncImpl>::type
63 typedef typename T::Eigen_BaseClassForSpecializationOfGlobalMathFuncImpl type;
66 #define EIGEN_MATHFUNC_IMPL(func, scalar) Eigen::internal::func##_impl<typename Eigen::internal::global_math_functions_filtering_base<scalar>::type> 67 #define EIGEN_MATHFUNC_RETVAL(func, scalar) typename Eigen::internal::func##_retval<typename Eigen::internal::global_math_functions_filtering_base<scalar>::type>::type 73 template<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
74 struct real_default_impl
76 typedef typename NumTraits<Scalar>::Real RealScalar;
78 static inline RealScalar run(
const Scalar& x)
84 template<
typename Scalar>
85 struct real_default_impl<Scalar,true>
87 typedef typename NumTraits<Scalar>::Real RealScalar;
89 static inline RealScalar run(
const Scalar& x)
96 template<
typename Scalar>
struct real_impl : real_default_impl<Scalar> {};
98 template<
typename Scalar>
101 typedef typename NumTraits<Scalar>::Real type;
108 template<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
109 struct imag_default_impl
111 typedef typename NumTraits<Scalar>::Real RealScalar;
113 static inline RealScalar run(
const Scalar&)
115 return RealScalar(0);
119 template<
typename Scalar>
120 struct imag_default_impl<Scalar,true>
122 typedef typename NumTraits<Scalar>::Real RealScalar;
124 static inline RealScalar run(
const Scalar& x)
131 template<
typename Scalar>
struct imag_impl : imag_default_impl<Scalar> {};
133 template<
typename Scalar>
136 typedef typename NumTraits<Scalar>::Real type;
143 template<
typename Scalar>
146 typedef typename NumTraits<Scalar>::Real RealScalar;
148 static inline RealScalar& run(Scalar& x)
150 return reinterpret_cast<RealScalar*
>(&x)[0];
153 static inline const RealScalar& run(
const Scalar& x)
155 return reinterpret_cast<const RealScalar*
>(&x)[0];
159 template<
typename Scalar>
160 struct real_ref_retval
162 typedef typename NumTraits<Scalar>::Real & type;
169 template<
typename Scalar,
bool IsComplex>
170 struct imag_ref_default_impl
172 typedef typename NumTraits<Scalar>::Real RealScalar;
174 static inline RealScalar& run(Scalar& x)
176 return reinterpret_cast<RealScalar*
>(&x)[1];
179 static inline const RealScalar& run(
const Scalar& x)
181 return reinterpret_cast<RealScalar*
>(&x)[1];
185 template<
typename Scalar>
186 struct imag_ref_default_impl<Scalar, false>
189 static inline Scalar run(Scalar&)
194 static inline const Scalar run(
const Scalar&)
200 template<
typename Scalar>
201 struct imag_ref_impl : imag_ref_default_impl<Scalar, NumTraits<Scalar>::IsComplex> {};
203 template<
typename Scalar>
204 struct imag_ref_retval
206 typedef typename NumTraits<Scalar>::Real & type;
213 template<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
217 static inline Scalar run(
const Scalar& x)
223 template<
typename Scalar>
224 struct conj_impl<Scalar,true>
227 static inline Scalar run(
const Scalar& x)
234 template<
typename Scalar>
244 template<
typename Scalar,
bool IsComplex>
245 struct abs2_impl_default
247 typedef typename NumTraits<Scalar>::Real RealScalar;
249 static inline RealScalar run(
const Scalar& x)
255 template<
typename Scalar>
256 struct abs2_impl_default<Scalar, true>
258 typedef typename NumTraits<Scalar>::Real RealScalar;
260 static inline RealScalar run(
const Scalar& x)
262 return real(x)*real(x) + imag(x)*imag(x);
266 template<
typename Scalar>
269 typedef typename NumTraits<Scalar>::Real RealScalar;
271 static inline RealScalar run(
const Scalar& x)
273 return abs2_impl_default<Scalar,NumTraits<Scalar>::IsComplex>::run(x);
277 template<
typename Scalar>
280 typedef typename NumTraits<Scalar>::Real type;
287 template<
typename Scalar,
bool IsComplex>
288 struct norm1_default_impl
290 typedef typename NumTraits<Scalar>::Real RealScalar;
292 static inline RealScalar run(
const Scalar& x)
294 EIGEN_USING_STD_MATH(abs);
295 return abs(real(x)) + abs(imag(x));
299 template<
typename Scalar>
300 struct norm1_default_impl<Scalar, false>
303 static inline Scalar run(
const Scalar& x)
305 EIGEN_USING_STD_MATH(abs);
310 template<
typename Scalar>
311 struct norm1_impl : norm1_default_impl<Scalar, NumTraits<Scalar>::IsComplex> {};
313 template<
typename Scalar>
316 typedef typename NumTraits<Scalar>::Real type;
323 template<
typename Scalar>
326 typedef typename NumTraits<Scalar>::Real RealScalar;
327 static inline RealScalar run(
const Scalar& x,
const Scalar& y)
329 EIGEN_USING_STD_MATH(abs);
330 EIGEN_USING_STD_MATH(sqrt);
331 RealScalar _x = abs(x);
332 RealScalar _y = abs(y);
344 if(p==RealScalar(0))
return RealScalar(0);
345 return p * sqrt(RealScalar(1) + qp*qp);
349 template<
typename Scalar>
352 typedef typename NumTraits<Scalar>::Real type;
359 template<
typename OldType,
typename NewType>
363 static inline NewType run(
const OldType& x)
365 return static_cast<NewType
>(x);
371 template<
typename OldType,
typename NewType>
373 inline NewType cast(
const OldType& x)
375 return cast_impl<OldType, NewType>::run(x);
382 #if EIGEN_HAS_CXX11_MATH 383 template<
typename Scalar>
385 static inline Scalar run(
const Scalar& x)
387 EIGEN_STATIC_ASSERT((!NumTraits<Scalar>::IsComplex), NUMERIC_TYPE_MUST_BE_REAL)
393 template<
typename Scalar>
396 static inline Scalar run(
const Scalar& x)
398 EIGEN_STATIC_ASSERT((!NumTraits<Scalar>::IsComplex), NUMERIC_TYPE_MUST_BE_REAL)
399 EIGEN_USING_STD_MATH(floor);
400 EIGEN_USING_STD_MATH(ceil);
401 return (x > Scalar(0)) ? floor(x + Scalar(0.5)) : ceil(x - Scalar(0.5));
406 template<
typename Scalar>
416 #if EIGEN_HAS_CXX11_MATH 417 template<
typename Scalar>
419 static inline Scalar run(
const Scalar& x)
421 EIGEN_USING_STD_MATH(arg);
426 template<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
427 struct arg_default_impl
429 typedef typename NumTraits<Scalar>::Real RealScalar;
431 static inline RealScalar run(
const Scalar& x)
433 return (x < Scalar(0)) ? Scalar(EIGEN_PI) : Scalar(0); }
436 template<
typename Scalar>
437 struct arg_default_impl<Scalar,true>
439 typedef typename NumTraits<Scalar>::Real RealScalar;
441 static inline RealScalar run(
const Scalar& x)
443 EIGEN_USING_STD_MATH(arg);
448 template<
typename Scalar>
struct arg_impl : arg_default_impl<Scalar> {};
451 template<
typename Scalar>
454 typedef typename NumTraits<Scalar>::Real type;
460 template<typename Scalar, bool isComplex = NumTraits<Scalar>::IsComplex >
463 static inline Scalar run(
const Scalar& x)
465 EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
466 typedef typename NumTraits<Scalar>::Real RealScalar;
467 EIGEN_USING_STD_MATH(log);
468 Scalar x1p = RealScalar(1) + x;
469 return ( x1p == Scalar(1) ) ? x : x * ( log(x1p) / (x1p - RealScalar(1)) );
473 #if EIGEN_HAS_CXX11_MATH 474 template<
typename Scalar>
475 struct log1p_impl<Scalar, false> {
476 static inline Scalar run(
const Scalar& x)
478 EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
485 template<
typename Scalar>
495 template<
typename Scalar,
bool IsInteger>
496 struct pow_default_impl
498 typedef Scalar retval;
499 static inline Scalar run(
const Scalar& x,
const Scalar& y)
501 EIGEN_USING_STD_MATH(pow);
506 template<
typename Scalar>
507 struct pow_default_impl<Scalar, true>
509 static inline Scalar run(Scalar x, Scalar y)
512 eigen_assert(!NumTraits<Scalar>::IsSigned || y >= 0);
525 template<
typename Scalar>
526 struct pow_impl : pow_default_impl<Scalar, NumTraits<Scalar>::IsInteger> {};
528 template<
typename Scalar>
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;
623 std::size_t range = ScalarX(y)-ScalarX(x);
624 std::size_t offset = 0;
626 std::size_t divisor = (range+RAND_MAX-1)/(range+1);
627 std::size_t multiplier = (range+RAND_MAX-1)/std::size_t(RAND_MAX);
630 offset = ( (std::size_t(std::rand()) * multiplier) / divisor );
631 }
while (offset > range);
633 return Scalar(ScalarX(x) + offset);
636 static inline Scalar run()
638 #ifdef EIGEN_MAKING_DOCS 639 return run(Scalar(NumTraits<Scalar>::IsSigned ? -10 : 0), Scalar(10));
641 enum { rand_bits = meta_floor_log2<(unsigned int)(RAND_MAX)+1>::value,
642 scalar_bits =
sizeof(Scalar) * CHAR_BIT,
643 shift = EIGEN_PLAIN_ENUM_MAX(0,
int(rand_bits) - int(scalar_bits)),
644 offset = NumTraits<Scalar>::IsSigned ? (1 << (EIGEN_PLAIN_ENUM_MIN(rand_bits,scalar_bits)-1)) : 0
646 return Scalar((std::rand() >> shift) - offset);
651 template<
typename Scalar>
652 struct random_default_impl<Scalar, true, false>
654 static inline Scalar run(
const Scalar& x,
const Scalar& y)
656 return Scalar(random(real(x), real(y)),
657 random(imag(x), imag(y)));
659 static inline Scalar run()
661 typedef typename NumTraits<Scalar>::Real RealScalar;
662 return Scalar(random<RealScalar>(), random<RealScalar>());
666 template<
typename Scalar>
667 inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random(const Scalar& x, const Scalar& y)
669 return EIGEN_MATHFUNC_IMPL(random, Scalar)::run(x, y);
672 template<
typename Scalar>
673 inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random()
675 return EIGEN_MATHFUNC_IMPL(random, Scalar)::run();
681 #if (EIGEN_HAS_CXX11_MATH && !(EIGEN_COMP_GNUC_STRICT && __FINITE_MATH_ONLY__)) || (EIGEN_COMP_MSVC>=1800) || (EIGEN_COMP_CLANG) 682 #define EIGEN_USE_STD_FPCLASSIFY 1 684 #define EIGEN_USE_STD_FPCLASSIFY 0 689 typename internal::enable_if<internal::is_integral<T>::value,
bool>::type
690 isnan_impl(
const T&) {
return false; }
694 typename internal::enable_if<internal::is_integral<T>::value,
bool>::type
695 isinf_impl(
const T&) {
return false; }
699 typename internal::enable_if<internal::is_integral<T>::value,
bool>::type
700 isfinite_impl(
const T&) {
return true; }
704 typename internal::enable_if<(!internal::is_integral<T>::value)&&(!NumTraits<T>::IsComplex),
bool>::type
705 isfinite_impl(
const T& x)
707 #if EIGEN_USE_STD_FPCLASSIFY 709 return isfinite EIGEN_NOT_A_MACRO (x);
711 return x<NumTraits<T>::highest() && x>NumTraits<T>::lowest();
717 typename internal::enable_if<(!internal::is_integral<T>::value)&&(!NumTraits<T>::IsComplex),
bool>::type
718 isinf_impl(
const T& x)
720 #if EIGEN_USE_STD_FPCLASSIFY 722 return isinf EIGEN_NOT_A_MACRO (x);
724 return x>NumTraits<T>::highest() || x<NumTraits<T>::lowest();
730 typename internal::enable_if<(!internal::is_integral<T>::value)&&(!NumTraits<T>::IsComplex),
bool>::type
731 isnan_impl(
const T& x)
733 #if EIGEN_USE_STD_FPCLASSIFY 735 return isnan EIGEN_NOT_A_MACRO (x);
741 #if (!EIGEN_USE_STD_FPCLASSIFY) 745 template<
typename T> EIGEN_DEVICE_FUNC
bool isinf_msvc_helper(T x)
747 return _fpclass(x)==_FPCLASS_NINF || _fpclass(x)==_FPCLASS_PINF;
751 EIGEN_DEVICE_FUNC
inline bool isnan_impl(
const long double& x) {
return _isnan(x); }
752 EIGEN_DEVICE_FUNC
inline bool isnan_impl(
const double& x) {
return _isnan(x); }
753 EIGEN_DEVICE_FUNC
inline bool isnan_impl(
const float& x) {
return _isnan(x); }
755 EIGEN_DEVICE_FUNC
inline bool isinf_impl(
const long double& x) {
return isinf_msvc_helper(x); }
756 EIGEN_DEVICE_FUNC
inline bool isinf_impl(
const double& x) {
return isinf_msvc_helper(x); }
757 EIGEN_DEVICE_FUNC
inline bool isinf_impl(
const float& x) {
return isinf_msvc_helper(x); }
759 #elif (defined __FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ && EIGEN_COMP_GNUC) 761 #if EIGEN_GNUC_AT_LEAST(5,0) 762 #define EIGEN_TMP_NOOPT_ATTRIB EIGEN_DEVICE_FUNC inline __attribute__((optimize("no-finite-math-only"))) 766 #define EIGEN_TMP_NOOPT_ATTRIB EIGEN_DEVICE_FUNC inline __attribute__((noinline,optimize("no-finite-math-only"))) 769 template<> EIGEN_TMP_NOOPT_ATTRIB
bool isnan_impl(
const long double& x) {
return __builtin_isnan(x); }
770 template<> EIGEN_TMP_NOOPT_ATTRIB
bool isnan_impl(
const double& x) {
return __builtin_isnan(x); }
771 template<> EIGEN_TMP_NOOPT_ATTRIB
bool isnan_impl(
const float& x) {
return __builtin_isnan(x); }
772 template<> EIGEN_TMP_NOOPT_ATTRIB
bool isinf_impl(
const double& x) {
return __builtin_isinf(x); }
773 template<> EIGEN_TMP_NOOPT_ATTRIB
bool isinf_impl(
const float& x) {
return __builtin_isinf(x); }
774 template<> EIGEN_TMP_NOOPT_ATTRIB
bool isinf_impl(
const long double& x) {
return __builtin_isinf(x); }
776 #undef EIGEN_TMP_NOOPT_ATTRIB 783 template<
typename T>
bool isfinite_impl(
const std::complex<T>& x);
784 template<
typename T>
bool isnan_impl(
const std::complex<T>& x);
785 template<
typename T>
bool isinf_impl(
const std::complex<T>& x);
795 #ifndef __CUDA_ARCH__ 798 EIGEN_ALWAYS_INLINE T mini(
const T& x,
const T& y)
800 EIGEN_USING_STD_MATH(min);
801 return min EIGEN_NOT_A_MACRO (x,y);
806 EIGEN_ALWAYS_INLINE T maxi(
const T& x,
const T& y)
808 EIGEN_USING_STD_MATH(max);
809 return max EIGEN_NOT_A_MACRO (x,y);
814 EIGEN_ALWAYS_INLINE T mini(
const T& x,
const T& y)
816 return y < x ? y : x;
820 EIGEN_ALWAYS_INLINE
float mini(
const float& x,
const float& y)
826 EIGEN_ALWAYS_INLINE T maxi(
const T& x,
const T& y)
828 return x < y ? y : x;
832 EIGEN_ALWAYS_INLINE
float maxi(
const float& x,
const float& y)
839 template<
typename Scalar>
841 inline EIGEN_MATHFUNC_RETVAL(real, Scalar) real(const Scalar& x)
843 return EIGEN_MATHFUNC_IMPL(real, Scalar)::run(x);
846 template<
typename Scalar>
848 inline typename internal::add_const_on_value_type< EIGEN_MATHFUNC_RETVAL(real_ref, Scalar) >::type real_ref(
const Scalar& x)
850 return internal::real_ref_impl<Scalar>::run(x);
853 template<
typename Scalar>
855 inline EIGEN_MATHFUNC_RETVAL(real_ref, Scalar) real_ref(Scalar& x)
857 return EIGEN_MATHFUNC_IMPL(real_ref, Scalar)::run(x);
860 template<
typename Scalar>
862 inline EIGEN_MATHFUNC_RETVAL(imag, Scalar) imag(const Scalar& x)
864 return EIGEN_MATHFUNC_IMPL(imag, Scalar)::run(x);
867 template<
typename Scalar>
869 inline EIGEN_MATHFUNC_RETVAL(arg, Scalar) arg(const Scalar& x)
871 return EIGEN_MATHFUNC_IMPL(arg, Scalar)::run(x);
874 template<
typename Scalar>
876 inline typename internal::add_const_on_value_type< EIGEN_MATHFUNC_RETVAL(imag_ref, Scalar) >::type imag_ref(
const Scalar& x)
878 return internal::imag_ref_impl<Scalar>::run(x);
881 template<
typename Scalar>
883 inline EIGEN_MATHFUNC_RETVAL(imag_ref, Scalar) imag_ref(Scalar& x)
885 return EIGEN_MATHFUNC_IMPL(imag_ref, Scalar)::run(x);
888 template<
typename Scalar>
890 inline EIGEN_MATHFUNC_RETVAL(conj, Scalar) conj(const Scalar& x)
892 return EIGEN_MATHFUNC_IMPL(conj, Scalar)::run(x);
895 template<
typename Scalar>
897 inline EIGEN_MATHFUNC_RETVAL(abs2, Scalar) abs2(const Scalar& x)
899 return EIGEN_MATHFUNC_IMPL(abs2, Scalar)::run(x);
902 template<
typename Scalar>
904 inline EIGEN_MATHFUNC_RETVAL(norm1, Scalar) norm1(const Scalar& x)
906 return EIGEN_MATHFUNC_IMPL(norm1, Scalar)::run(x);
909 template<
typename Scalar>
911 inline EIGEN_MATHFUNC_RETVAL(hypot, Scalar) hypot(const Scalar& x, const Scalar& y)
913 return EIGEN_MATHFUNC_IMPL(hypot, Scalar)::run(x, y);
916 template<
typename Scalar>
918 inline EIGEN_MATHFUNC_RETVAL(log1p, Scalar) log1p(const Scalar& x)
920 return EIGEN_MATHFUNC_IMPL(log1p, Scalar)::run(x);
923 template<
typename Scalar>
925 inline EIGEN_MATHFUNC_RETVAL(pow, Scalar) pow(const Scalar& x, const Scalar& y)
927 return EIGEN_MATHFUNC_IMPL(pow, Scalar)::run(x, y);
930 template<
typename T> EIGEN_DEVICE_FUNC bool (isnan) (
const T &x) {
return internal::isnan_impl(x); }
931 template<
typename T> EIGEN_DEVICE_FUNC bool (isinf) (
const T &x) {
return internal::isinf_impl(x); }
932 template<
typename T> EIGEN_DEVICE_FUNC bool (isfinite)(
const T &x) {
return internal::isfinite_impl(x); }
934 template<
typename Scalar>
936 inline EIGEN_MATHFUNC_RETVAL(round, Scalar) round(const Scalar& x)
938 return EIGEN_MATHFUNC_IMPL(round, Scalar)::run(x);
943 T (floor)(
const T& x)
945 EIGEN_USING_STD_MATH(floor);
953 EIGEN_USING_STD_MATH(ceil);
959 inline int log2(
int x)
963 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 };
969 return table[(v * 0x07C4ACDDU) >> 27];
977 bool isfinite_impl(
const std::complex<T>& x)
979 return (numext::isfinite)(numext::real(x)) && (numext::isfinite)(numext::imag(x));
983 bool isnan_impl(
const std::complex<T>& x)
985 return (numext::isnan)(numext::real(x)) || (numext::isnan)(numext::imag(x));
989 bool isinf_impl(
const std::complex<T>& x)
991 return ((numext::isinf)(numext::real(x)) || (numext::isinf)(numext::imag(x))) && (!(numext::isnan)(x));
998 template<
typename Scalar,
1001 struct scalar_fuzzy_default_impl {};
1003 template<
typename Scalar>
1004 struct scalar_fuzzy_default_impl<Scalar, false, false>
1006 typedef typename NumTraits<Scalar>::Real RealScalar;
1007 template<
typename OtherScalar> EIGEN_DEVICE_FUNC
1008 static inline bool isMuchSmallerThan(
const Scalar& x,
const OtherScalar& y,
const RealScalar& prec)
1010 EIGEN_USING_STD_MATH(abs);
1011 return abs(x) <= abs(y) * prec;
1014 static inline bool isApprox(
const Scalar& x,
const Scalar& y,
const RealScalar& prec)
1016 EIGEN_USING_STD_MATH(abs);
1017 return abs(x - y) <= numext::mini(abs(x), abs(y)) * prec;
1020 static inline bool isApproxOrLessThan(
const Scalar& x,
const Scalar& y,
const RealScalar& prec)
1022 return x <= y || isApprox(x, y, prec);
1026 template<
typename Scalar>
1027 struct scalar_fuzzy_default_impl<Scalar, false, true>
1029 typedef typename NumTraits<Scalar>::Real RealScalar;
1030 template<
typename OtherScalar> EIGEN_DEVICE_FUNC
1031 static inline bool isMuchSmallerThan(
const Scalar& x,
const Scalar&,
const RealScalar&)
1033 return x == Scalar(0);
1036 static inline bool isApprox(
const Scalar& x,
const Scalar& y,
const RealScalar&)
1041 static inline bool isApproxOrLessThan(
const Scalar& x,
const Scalar& y,
const RealScalar&)
1047 template<
typename Scalar>
1048 struct scalar_fuzzy_default_impl<Scalar, true, false>
1050 typedef typename NumTraits<Scalar>::Real RealScalar;
1051 template<
typename OtherScalar>
1052 static inline bool isMuchSmallerThan(
const Scalar& x,
const OtherScalar& y,
const RealScalar& prec)
1054 return numext::abs2(x) <= numext::abs2(y) * prec * prec;
1056 static inline bool isApprox(
const Scalar& x,
const Scalar& y,
const RealScalar& prec)
1058 return numext::abs2(x - y) <= numext::mini(numext::abs2(x), numext::abs2(y)) * prec * prec;
1062 template<
typename Scalar>
1063 struct scalar_fuzzy_impl : scalar_fuzzy_default_impl<Scalar, NumTraits<Scalar>::IsComplex, NumTraits<Scalar>::IsInteger> {};
1065 template<
typename Scalar,
typename OtherScalar> EIGEN_DEVICE_FUNC
1066 inline bool isMuchSmallerThan(
const Scalar& x,
const OtherScalar& y,
1067 typename NumTraits<Scalar>::Real precision = NumTraits<Scalar>::dummy_precision())
1069 return scalar_fuzzy_impl<Scalar>::template isMuchSmallerThan<OtherScalar>(x, y, precision);
1072 template<
typename Scalar> EIGEN_DEVICE_FUNC
1073 inline bool isApprox(
const Scalar& x,
const Scalar& y,
1074 typename NumTraits<Scalar>::Real precision = NumTraits<Scalar>::dummy_precision())
1076 return scalar_fuzzy_impl<Scalar>::isApprox(x, y, precision);
1079 template<
typename Scalar> EIGEN_DEVICE_FUNC
1080 inline bool isApproxOrLessThan(
const Scalar& x,
const Scalar& y,
1081 typename NumTraits<Scalar>::Real precision = NumTraits<Scalar>::dummy_precision())
1083 return scalar_fuzzy_impl<Scalar>::isApproxOrLessThan(x, y, precision);
1090 template<>
struct random_impl<bool>
1092 static inline bool run()
1094 return random<int>(0,1)==0 ?
false :
true;
1098 template<>
struct scalar_fuzzy_impl<bool>
1100 typedef bool RealScalar;
1102 template<
typename OtherScalar> EIGEN_DEVICE_FUNC
1103 static inline bool isMuchSmallerThan(
const bool& x,
const bool&,
const bool&)
1109 static inline bool isApprox(
bool x,
bool y,
bool)
1115 static inline bool isApproxOrLessThan(
const bool& x,
const bool& y,
const bool&)
1127 #endif // EIGEN_MATHFUNCTIONS_H
Definition: StdDeque.h:58
Definition: Eigen_Colamd.h:54