1 #ifndef SimTK_SIMMATRIX_NTRAITS_H_ 2 #define SimTK_SIMMATRIX_NTRAITS_H_ 71 template <
class R>
class conjugate;
76 template <
class T>
class CNT;
79 template <
class N>
class NTraits;
80 template <
class R>
class NTraits< complex<R> >;
81 template <
class R>
class NTraits< conjugate<R> >;
82 template <>
class NTraits<float>;
83 template <>
class NTraits<double>;
84 template <>
class NTraits<long double>;
94 template <
class N>
class negator;
103 template <
class R1,
class R2>
struct Widest {};
112 template <>
struct Widest<long double,long double> {
typedef long double Type;
typedef long double Precision;};
113 template <
class R1,
class R2>
struct Widest< complex<R1>,complex<R2> > {
114 typedef complex< typename Widest<R1,R2>::Type >
Type;
117 template <
class R1,
class R2>
struct Widest< complex<R1>,R2 > {
118 typedef complex< typename Widest<R1,R2>::Type >
Type;
121 template <
class R1,
class R2>
struct Widest< R1,complex<R2> > {
122 typedef complex< typename Widest<R1,R2>::Type >
Type;
145 template <
class R1,
class R2>
struct Narrowest< complex<R1>,complex<R2> > {
146 typedef complex< typename Narrowest<R1,R2>::Type >
Type;
149 template <
class R1,
class R2>
struct Narrowest< complex<R1>,R2 > {
150 typedef complex< typename Narrowest<R1,R2>::Type >
Type;
153 template <
class R1,
class R2>
struct Narrowest< R1,complex<R2> > {
154 typedef complex< typename Narrowest<R1,R2>::Type >
Type;
163 static const float&
getEps() {
static const float c=std::numeric_limits<float>::epsilon();
return c;}
165 static const float&
getSignificant() {
static const float c=std::pow(getEps(), 0.875f);
return c;}
171 static const double&
getEps() {
static const double c=std::numeric_limits<double>::epsilon();
return c;}
172 static const double&
getSignificant() {
static const double c=std::pow(getEps(), 0.875);
return c;}
177 static const long double&
getEps() {
static const long double c=std::numeric_limits<long double>::epsilon();
return c;}
178 static const long double&
getSignificant() {
static const long double c=std::pow(getEps(), 0.875L);
return c;}
200 inline bool isNaN(
const float& x) {
return std::isnan(x);}
201 inline bool isNaN(
const double& x) {
return std::isnan(x);}
202 inline bool isNaN(
const long double& x) {
return std::isnan(x);}
204 template <
class P>
inline bool 208 template <
class P>
inline bool 210 {
return isNaN(x.real()) ||
isNaN(x.negImag());}
227 inline bool isFinite(
const float& x) {
return std::isfinite(x);}
228 inline bool isFinite(
const double& x) {
return std::isfinite(x);}
229 inline bool isFinite(
const long double& x) {
return std::isfinite(x);}
231 template <
class P>
inline bool 235 template <
class P>
inline bool 256 inline bool isInf(
const float& x) {
return std::isinf(x);}
257 inline bool isInf(
const double& x) {
return std::isinf(x);}
258 inline bool isInf(
const long double& x) {
return std::isinf(x);}
260 template <
class P>
inline bool 266 template <
class P>
inline bool 268 return (
isInf(x.real()) && !
isNaN(x.negImag()))
317 return std::abs(a-b) <= scale*(float)tol; }
323 return std::abs(a-b) <= scale*tol; }
329 return std::abs(a-b) <= scale*(
long double)tol; }
384 template <
class P,
class Q>
386 (
const std::complex<P>& a,
const std::complex<Q>& b,
394 template <
class P,
class Q>
404 template <
class P,
class Q>
414 template <
class P,
class Q>
422 template <
class P>
inline bool 427 template <
class P>
inline bool 432 template <
class P>
inline bool 437 template <
class P>
inline bool 442 template <
class P>
inline bool 447 template <
class P>
inline bool 452 template <
class P>
inline bool 457 template <
class P>
inline bool 463 template <
class P>
inline bool 468 template <
class P>
inline bool 473 template <
class P>
inline bool 478 template <
class P>
inline bool 483 template <
class P>
inline bool 488 template <
class P>
inline bool 493 template <
class P>
inline bool 498 template <
class P>
inline bool 506 template <
class N>
class NTraits {
512 template <
class R>
class NTraits< complex<R> > {
513 typedef complex<R> C;
549 template <
class P>
struct Result {
557 template <
class P>
struct Substitute {
570 RealStrideFactor = 2,
577 SignInterpretation = 1
579 static const T*
getData(
const T& t) {
return &t; }
581 static const R&
real(
const T& t) {
return (reinterpret_cast<const R*>(&t))[0]; }
582 static R&
real(T& t) {
return (reinterpret_cast<R*>(&t))[0]; }
583 static const R&
imag(
const T& t) {
return (reinterpret_cast<const R*>(&t))[1]; }
584 static R&
imag(T& t) {
return (reinterpret_cast<R*>(&t))[1]; }
586 static const TNeg&
negate(
const T& t) {
return reinterpret_cast<const TNeg&
>(t);}
587 static TNeg&
negate(T& t) {
return reinterpret_cast<TNeg&
>(t);}
589 static const THerm&
transpose(
const T& t) {
return reinterpret_cast<const THerm&
>(t);}
590 static THerm&
transpose(T& t) {
return reinterpret_cast<THerm&
>(t);}
593 {
return reinterpret_cast<const TPosTrans&
>(t);}
595 {
return reinterpret_cast<TPosTrans&
>(t);}
598 {
return reinterpret_cast<const TWithoutNegator&
>(t);}
600 {
return reinterpret_cast<TWithoutNegator&
>(t);}
603 {
return t.real()*t.real() + t.imag()*t.imag(); }
605 {
return std::sqrt(t); }
606 static TAbs
abs(
const T& t)
610 static TInvert
invert(
const T& t) {
return TReal(1)/t;}
622 static const T c = T(0,1);
682 #define SimTK_BNTCMPLX_SPEC(T1,T2) \ 683 template<> template<> struct NTraits< complex<T1> >::Result<T2> { \ 684 typedef Widest< complex<T1>,T2 >::Type W; \ 685 typedef W Mul; typedef W Dvd; typedef W Add; typedef W Sub; \ 687 template<> template<> struct NTraits< complex<T1> >::Result< complex<T2> > { \ 688 typedef Widest< complex<T1>,complex<T2> >::Type W; \ 689 typedef W Mul; typedef W Dvd; typedef W Add; typedef W Sub; \ 691 template<> template<> struct NTraits< complex<T1> >::Result< conjugate<T2> > { \ 692 typedef Widest< complex<T1>,complex<T2> >::Type W; \ 693 typedef W Mul; typedef W Dvd; typedef W Add; typedef W Sub; \ 698 #undef SimTK_BNTCMPLX_SPEC 703 typedef complex<R> C;
737 template <
class P>
struct Result {
745 template <
class P>
struct Substitute {
758 RealStrideFactor = 2,
765 SignInterpretation = 1
768 static const T*
getData(
const T& t) {
return &t; }
770 static const TReal&
real(
const T& t) {
return t.real(); }
771 static TReal&
real(T& t) {
return t.real(); }
772 static const TImag&
imag(
const T& t) {
return t.imag(); }
773 static TImag&
imag(T& t) {
return t.imag(); }
775 static const TNeg&
negate(
const T& t) {
return reinterpret_cast<const TNeg&
>(t);}
776 static TNeg&
negate(T& t) {
return reinterpret_cast<TNeg&
>(t);}
778 static const THerm&
transpose(
const T& t) {
return t.conj();}
782 {
return reinterpret_cast<const TPosTrans&
>(t);}
784 {
return reinterpret_cast<TPosTrans&
>(t);}
787 {
return reinterpret_cast<const TWithoutNegator&
>(t);}
789 {
return reinterpret_cast<TWithoutNegator&
>(t);}
792 {
return t.real()*t.real() + t.negImag()*t.negImag(); }
794 {
return std::sqrt(C(t)); }
795 static TAbs
abs(
const T& t)
798 {
return TStandard(t); }
804 return reinterpret_cast<const TInvert&
>(cmplx); }
821 static const T c = T(0,-1);
894 #define SimTK_NTRAITS_CONJ_SPEC(T1,T2) \ 895 template<> template<> struct NTraits< conjugate<T1> >::Result<T2> { \ 896 typedef conjugate<Widest<T1,T2>::Type> W; \ 897 typedef W Mul; typedef W Dvd; typedef W Add; typedef W Sub; \ 899 template<> template<> struct NTraits< conjugate<T1> >::Result<complex<T2> >{\ 900 typedef Widest<complex<T1>,complex<T2> >::Type W; \ 901 typedef W Mul; typedef W Dvd; typedef W Add; typedef negator<W> Sub; \ 903 template<> template<> struct NTraits< conjugate<T1> >::Result<conjugate<T2> >{\ 904 typedef Widest<T1,T2>::Type W; typedef complex<W> WC; \ 905 typedef negator<WC> Mul; typedef WC Dvd; typedef conjugate<W> Add; typedef WC Sub;\ 913 #undef SimTK_NTRAITS_CONJ_SPEC 923 #define SimTK_DEFINE_REAL_NTRAITS(R) \ 924 template <> class NTraits<R> { \ 927 typedef negator<T> TNeg; \ 928 typedef T TWithoutNegator; \ 931 typedef complex<T> TComplex; \ 933 typedef T TPosTrans; \ 934 typedef T TSqHermT; \ 935 typedef T TSqTHerm; \ 936 typedef T TElement; \ 941 typedef T TStandard; \ 943 typedef T TNormalize; \ 945 typedef T ULessScalar; \ 947 typedef T StdNumber; \ 948 typedef T Precision; \ 949 typedef T ScalarNormSq; \ 950 template <class P> struct Result { \ 951 typedef typename CNT<P>::template Result<R>::Mul Mul; \ 952 typedef typename CNT< typename CNT<P>::THerm >::template Result<R>::Mul Dvd; \ 953 typedef typename CNT<P>::template Result<R>::Add Add; \ 954 typedef typename CNT< typename CNT<P>::TNeg >::template Result<R>::Add Sub; \ 956 template <class P> struct Substitute { \ 964 NPackedElements = 1, \ 965 NActualElements = 1, \ 966 NActualScalars = 1, \ 968 RealStrideFactor = 1, \ 969 ArgDepth = SCALAR_DEPTH, \ 975 SignInterpretation = 1 \ 977 static const T* getData(const T& t) { return &t; } \ 978 static T* updData(T& t) { return &t; } \ 979 static const T& real(const T& t) { return t; } \ 980 static T& real(T& t) { return t; } \ 981 static const T& imag(const T&) { return getZero(); } \ 982 static T& imag(T&) { assert(false); return *reinterpret_cast<T*>(0); } \ 983 static const TNeg& negate(const T& t) {return reinterpret_cast<const TNeg&>(t);} \ 984 static TNeg& negate(T& t) {return reinterpret_cast<TNeg&>(t);} \ 985 static const THerm& transpose(const T& t) {return reinterpret_cast<const THerm&>(t);} \ 986 static THerm& transpose(T& t) {return reinterpret_cast<THerm&>(t);} \ 987 static const TPosTrans& positionalTranspose(const T& t) \ 988 {return reinterpret_cast<const TPosTrans&>(t);} \ 989 static TPosTrans& positionalTranspose(T& t) \ 990 {return reinterpret_cast<TPosTrans&>(t);} \ 991 static const TWithoutNegator& castAwayNegatorIfAny(const T& t) \ 992 {return reinterpret_cast<const TWithoutNegator&>(t);} \ 993 static TWithoutNegator& updCastAwayNegatorIfAny(T& t) \ 994 {return reinterpret_cast<TWithoutNegator&>(t);} \ 995 static ScalarNormSq scalarNormSqr(const T& t) {return t*t;} \ 996 static TSqrt sqrt(const T& t) {return std::sqrt(t);} \ 997 static TAbs abs(const T& t) {return std::abs(t);} \ 998 static const TStandard& standardize(const T& t) {return t;} \ 999 static TNormalize normalize(const T& t) {return (t>0?T(1):(t<0?T(-1):getNaN()));} \ 1000 static TInvert invert(const T& t) {return T(1)/t;} \ 1002 static const T& getEps() {return RTraits<T>::getEps();} \ 1003 static const T& getSignificant() {return RTraits<T>::getSignificant();} \ 1004 static const T& getNaN() {static const T c=std::numeric_limits<T>::quiet_NaN(); return c;} \ 1005 static const T& getInfinity() {static const T c=std::numeric_limits<T>::infinity(); return c;} \ 1006 static const T& getLeastPositive(){static const T c=std::numeric_limits<T>::min(); return c;} \ 1007 static const T& getMostPositive() {static const T c=std::numeric_limits<T>::max(); return c;} \ 1008 static const T& getLeastNegative(){static const T c=-std::numeric_limits<T>::min(); return c;} \ 1009 static const T& getMostNegative() {static const T c=-std::numeric_limits<T>::max(); return c;} \ 1010 static const T& getSqrtEps() {static const T c=std::sqrt(getEps()); return c;} \ 1011 static const T& getTiny() {static const T c=std::pow(getEps(), (T)1.25L); return c;} \ 1012 static bool isFinite(const T& t) {return SimTK::isFinite(t);} \ 1013 static bool isNaN (const T& t) {return SimTK::isNaN(t);} \ 1014 static bool isInf (const T& t) {return SimTK::isInf(t);} \ 1017 static double getDefaultTolerance() {return RTraits<T>::getDefaultTolerance();} \ 1018 static bool isNumericallyEqual(const T& t, const float& f) {return SimTK::isNumericallyEqual(t,f);} \ 1019 static bool isNumericallyEqual(const T& t, const double& d) {return SimTK::isNumericallyEqual(t,d);} \ 1020 static bool isNumericallyEqual(const T& t, const long double& l) {return SimTK::isNumericallyEqual(t,l);} \ 1021 static bool isNumericallyEqual(const T& t, int i) {return SimTK::isNumericallyEqual(t,i);} \ 1023 static bool isNumericallyEqual(const T& t, const float& f, double tol){return SimTK::isNumericallyEqual(t,f,tol);} \ 1024 static bool isNumericallyEqual(const T& t, const double& d, double tol){return SimTK::isNumericallyEqual(t,d,tol);} \ 1025 static bool isNumericallyEqual(const T& t, const long double& l, double tol){return SimTK::isNumericallyEqual(t,l,tol);} \ 1026 static bool isNumericallyEqual(const T& t, int i, double tol){return SimTK::isNumericallyEqual(t,i,tol);} \ 1028 static const T& getZero() {static const T c=(T)(0); return c;} \ 1029 static const T& getOne() {static const T c=(T)(1); return c;} \ 1030 static const T& getMinusOne() {static const T c=(T)(-1); return c;} \ 1031 static const T& getTwo() {static const T c=(T)(2); return c;} \ 1032 static const T& getThree() {static const T c=(T)(3); return c;} \ 1033 static const T& getOneHalf() {static const T c=(T)(0.5L); return c;} \ 1034 static const T& getOneThird() {static const T c=(T)(1.L/3.L); return c;} \ 1035 static const T& getOneFourth() {static const T c=(T)(0.25L); return c;} \ 1036 static const T& getOneFifth() {static const T c=(T)(0.2L); return c;} \ 1037 static const T& getOneSixth() {static const T c=(T)(1.L/6.L); return c;} \ 1038 static const T& getOneSeventh() {static const T c=(T)(1.L/7.L); return c;} \ 1039 static const T& getOneEighth() {static const T c=(T)(0.125L); return c;} \ 1040 static const T& getOneNinth() {static const T c=(T)(1.L/9.L); return c;} \ 1041 static const T& getPi() {static const T c=(T)(SimTK_PI); return c;} \ 1042 static const T& getOneOverPi() {static const T c=(T)(1.L/SimTK_PI); return c;} \ 1043 static const T& getE() {static const T c=(T)(SimTK_E); return c;} \ 1044 static const T& getLog2E() {static const T c=(T)(SimTK_LOG2E); return c;} \ 1045 static const T& getLog10E() {static const T c=(T)(SimTK_LOG10E); return c;} \ 1046 static const T& getSqrt2() {static const T c=(T)(SimTK_SQRT2); return c;} \ 1047 static const T& getOneOverSqrt2() {static const T c=(T)(1.L/SimTK_SQRT2); return c;} \ 1048 static const T& getSqrt3() {static const T c=(T)(SimTK_SQRT3); return c;} \ 1049 static const T& getOneOverSqrt3() {static const T c=(T)(1.L/SimTK_SQRT3); return c;} \ 1050 static const T& getCubeRoot2() {static const T c=(T)(SimTK_CBRT2); return c;} \ 1051 static const T& getCubeRoot3() {static const T c=(T)(SimTK_CBRT3); return c;} \ 1052 static const T& getLn2() {static const T c=(T)(SimTK_LN2); return c;} \ 1053 static const T& getLn10() {static const T c=(T)(SimTK_LN10); return c;} \ 1055 static int getNumDigits() {static const int c=(int)(std::log10(1/getEps()) -0.5); return c;} \ 1056 static int getLosslessNumDigits() {static const int c=(int)(std::log10(1/getTiny())+0.5); return c;} \ 1058 template<> struct NTraits<R>::Result<float> \ 1059 {typedef Widest<R,float>::Type Mul;typedef Mul Dvd;typedef Mul Add;typedef Mul Sub;}; \ 1060 template<> struct NTraits<R>::Result<double> \ 1061 {typedef Widest<R,double>::Type Mul;typedef Mul Dvd;typedef Mul Add;typedef Mul Sub;}; \ 1062 template<> struct NTraits<R>::Result<long double> \ 1063 {typedef Widest<R,long double>::Type Mul;typedef Mul Dvd;typedef Mul Add;typedef Mul Sub;}; \ 1064 template<> struct NTraits<R>::Result<complex<float> > \ 1065 {typedef Widest<R,complex<float> >::Type Mul;typedef Mul Dvd;typedef Mul Add;typedef Mul Sub;}; \ 1066 template<> struct NTraits<R>::Result<complex<double> > \ 1067 {typedef Widest<R,complex<double> >::Type Mul;typedef Mul Dvd;typedef Mul Add;typedef Mul Sub;}; \ 1068 template<> struct NTraits<R>::Result<complex<long double> > \ 1069 {typedef Widest<R,complex<long double> >::Type Mul;typedef Mul Dvd;typedef Mul Add;typedef Mul Sub;}; \ 1070 template<> struct NTraits<R>::Result<conjugate<float> > \ 1071 {typedef conjugate<Widest<R,float>::Type> Mul;typedef Mul Dvd;typedef Mul Add;typedef Mul Sub;}; \ 1072 template<> struct NTraits<R>::Result<conjugate<double> > \ 1073 {typedef conjugate<Widest<R,double>::Type> Mul;typedef Mul Dvd;typedef Mul Add;typedef Mul Sub;}; \ 1074 template<> struct NTraits<R>::Result<conjugate<long double> > \ 1075 {typedef conjugate<Widest<R,long double>::Type> Mul;typedef Mul Dvd;typedef Mul Add;typedef Mul Sub;} 1079 #undef SimTK_DEFINE_REAL_NTRAITS 1082 template <
class R>
class CNT< complex<R> > :
public NTraits< complex<R> > { };
1086 template <>
class CNT<long double> :
public NTraits<long double> { };
1091 #endif //SimTK_SIMMATRIX_NTRAITS_H_ static TNormalize normalize(const T &t)
Definition: NTraits.h:609
static TImag & imag(T &t)
Definition: NTraits.h:773
static bool isNumericallyEqual(const T &a, int b)
Definition: NTraits.h:647
static const T & getOneFourth()
Definition: NTraits.h:857
CNT< P >::template Result< C >::Mul Mul
Definition: NTraits.h:550
C ULessScalar
Definition: NTraits.h:537
C TStandard
Definition: NTraits.h:532
static const T & getInfinity()
Definition: NTraits.h:616
R TReal
Definition: NTraits.h:708
static const T & getOneEighth()
Definition: NTraits.h:662
double Type
Definition: NTraits.h:143
static bool isNumericallyEqual(const T &a, const double &b)
Definition: NTraits.h:643
static const T & getOneOverSqrt3()
Definition: NTraits.h:672
C TInvert
Definition: NTraits.h:533
double Type
Definition: NTraits.h:140
static const T & getLn10()
Definition: NTraits.h:676
static const T & getOne()
Definition: NTraits.h:851
static const T & getMinusOne()
Definition: NTraits.h:653
static const T & getSqrt3()
Definition: NTraits.h:671
static const T & getOneSixth()
Definition: NTraits.h:660
conjugate< R > TCol
Definition: NTraits.h:717
complex< typename Widest< R1, R2 >::Type > Type
Definition: NTraits.h:122
static const T & getLog10E()
Definition: NTraits.h:867
conjugate< R > TComplex
Definition: NTraits.h:710
static bool isNumericallyEqual(const T &a, const double &b, double tol)
Definition: NTraits.h:644
RTraits is a helper class for NTraits.
Definition: NTraits.h:159
SimTK_DEFINE_REAL_NTRAITS(float)
long double Type
Definition: NTraits.h:109
float Precision
Definition: NTraits.h:142
static const T & getOneSeventh()
Definition: NTraits.h:860
R TSqTHerm
Definition: NTraits.h:714
static const T & getThree()
Definition: NTraits.h:854
static bool isNumericallyEqual(const T &a, const long double &b, double tol)
Definition: NTraits.h:845
static TPosTrans & positionalTranspose(T &t)
Definition: NTraits.h:783
complex< R > TSqrt
Definition: NTraits.h:719
P Type
Definition: NTraits.h:558
R ScalarNormSq
Definition: NTraits.h:730
static const T & getCubeRoot3()
Definition: NTraits.h:674
long double Type
Definition: NTraits.h:144
R TReal
Definition: NTraits.h:519
CNT< typename CNT< P >::TNeg >::template Result< C >::Add Sub
Definition: NTraits.h:553
static const T & getZero()
Definition: NTraits.h:651
static bool isFinite(const T &t)
Definition: NTraits.h:626
static const T & getOneThird()
Definition: NTraits.h:856
C TRow
Definition: NTraits.h:527
static const THerm & transpose(const T &t)
Definition: NTraits.h:778
static bool isNumericallyEqual(const T &a, const long double &b, double tol)
Definition: NTraits.h:646
This is the top-level SimTK namespace into which all SimTK names are placed to avoid collision with o...
Definition: Assembler.h:37
SimTK::conjugate<R> should be instantiated only for float, double, long double.
Definition: String.h:45
static const THerm & transpose(const T &t)
Definition: NTraits.h:589
long double Type
Definition: NTraits.h:106
static bool isNumericallyEqual(const T &a, const float &b)
Definition: NTraits.h:641
static const T & getSqrt2()
Definition: NTraits.h:868
double Type
Definition: NTraits.h:105
static bool isNumericallyEqual(const T &a, const complex< R2 > &b, double tol)
Definition: NTraits.h:837
static const T & getOneSixth()
Definition: NTraits.h:859
float Type
Definition: NTraits.h:142
conjugate< R > TInvert
Definition: NTraits.h:722
static const T & getOneNinth()
Definition: NTraits.h:663
static bool isNaN(const T &t)
Definition: NTraits.h:826
static const double & getSignificant()
Definition: NTraits.h:172
complex< R > THerm
Definition: NTraits.h:711
static const T & getOneFifth()
Definition: NTraits.h:659
static const TPosTrans & positionalTranspose(const T &t)
Definition: NTraits.h:592
static const T & getThree()
Definition: NTraits.h:655
static bool isNaN(const T &t)
Definition: NTraits.h:627
static const T & getSqrt2()
Definition: NTraits.h:669
C TNormalize
Definition: NTraits.h:534
conjugate< R > ULessScalar
Definition: NTraits.h:726
static TInvert invert(const T &t)
Definition: NTraits.h:802
static bool isNumericallyEqual(const T &a, int b, double tol)
Definition: NTraits.h:847
static const T & getOneOverSqrt2()
Definition: NTraits.h:869
static const T & getOneNinth()
Definition: NTraits.h:862
static const T & getMinusOne()
Definition: NTraits.h:852
static const T & getOneOverSqrt2()
Definition: NTraits.h:670
static const T & getLog2E()
Definition: NTraits.h:667
CNT< P >::template Result< T >::Mul Mul
Definition: NTraits.h:738
float Precision
Definition: NTraits.h:138
float Type
Definition: NTraits.h:137
static const TNeg & negate(const T &t)
Definition: NTraits.h:775
static const TPosTrans & positionalTranspose(const T &t)
Definition: NTraits.h:781
static const float & getEps()
Attainable accuracy at this precision.
Definition: NTraits.h:163
static const T & getE()
Definition: NTraits.h:865
conjugate< R > T
Definition: NTraits.h:705
C TWithoutNegator
Definition: NTraits.h:517
negator<N>, where N is a number type (real, complex, conjugate), is represented in memory identically...
Definition: String.h:44
C T
Definition: NTraits.h:515
conjugate< R > Number
Definition: NTraits.h:727
Widest< R1, R2 >::Precision Precision
Definition: NTraits.h:123
static const T & getCubeRoot2()
Definition: NTraits.h:673
Widest< R1, R2 >::Precision Precision
Definition: NTraits.h:115
static const T & getNaN()
Definition: NTraits.h:808
CNT< P >::template Result< T >::Add Add
Definition: NTraits.h:740
static const TNeg & negate(const T &t)
Definition: NTraits.h:586
static bool isNumericallyEqual(const T &a, const conjugate< R2 > &b)
Definition: NTraits.h:636
static THerm & transpose(T &t)
Definition: NTraits.h:590
static const T & getLn2()
Definition: NTraits.h:675
static const T & getCubeRoot2()
Definition: NTraits.h:872
C Scalar
Definition: NTraits.h:536
negator< R > TImag
Definition: NTraits.h:709
static TSqrt sqrt(const T &t)
Definition: NTraits.h:793
static const T & getPi()
Definition: NTraits.h:664
static TInvert invert(const T &t)
Definition: NTraits.h:610
static const T & getPi()
Definition: NTraits.h:863
static TReal & real(T &t)
Definition: NTraits.h:771
float Precision
Definition: NTraits.h:136
SimTK_BNTCMPLX_SPEC(float, float)
float Type
Definition: NTraits.h:136
R TImag
Definition: NTraits.h:520
C TComplex
Definition: NTraits.h:521
double Type
Definition: NTraits.h:141
static TAbs abs(const T &t)
Definition: NTraits.h:606
static TNeg & negate(T &t)
Definition: NTraits.h:587
complex< typename Widest< R1, R2 >::Type > Type
Definition: NTraits.h:118
static TSqrt sqrt(const T &t)
Definition: NTraits.h:604
R Precision
Definition: NTraits.h:729
CNT< typename CNT< P >::TNeg >::template Result< T >::Add Sub
Definition: NTraits.h:741
static bool isNumericallyEqual(const T &a, const conjugate< R2 > &b, double tol)
Definition: NTraits.h:833
bool isFinite(const negator< float > &x)
Definition: negator.h:287
R TAbs
Definition: NTraits.h:720
static R & real(T &t)
Definition: NTraits.h:582
conjugate< R > TNormalize
Definition: NTraits.h:723
Definition: CompositeNumericalTypes.h:116
static const R & imag(const T &t)
Definition: NTraits.h:583
static bool isFinite(const T &t)
Definition: NTraits.h:825
Narrowest< R1, R2 >::Precision Precision
Definition: NTraits.h:151
conjugate< R > TWithoutNegator
Definition: NTraits.h:707
CNT< typename CNT< P >::THerm >::template Result< T >::Mul Dvd
Definition: NTraits.h:739
conjugate< R > TPosTrans
Definition: NTraits.h:712
static bool isNumericallyEqual(const T &a, int b)
Definition: NTraits.h:846
static TAbs abs(const T &t)
Definition: NTraits.h:795
float Precision
Definition: NTraits.h:137
double Type
Definition: NTraits.h:107
static TNormalize normalize(const T &t)
Definition: NTraits.h:799
static const T & getTwo()
Definition: NTraits.h:853
static const double & getEps()
Definition: NTraits.h:171
C TCol
Definition: NTraits.h:528
static const TWithoutNegator & castAwayNegatorIfAny(const T &t)
Definition: NTraits.h:786
static TStandard standardize(const T &t)
Definition: NTraits.h:797
static TWithoutNegator & updCastAwayNegatorIfAny(T &t)
Definition: NTraits.h:599
static const T & getTwo()
Definition: NTraits.h:654
float Type
Definition: NTraits.h:139
R TAbs
Definition: NTraits.h:531
This class is specialized for all 36 combinations of standard types (that is, real and complex types ...
Definition: NTraits.h:103
static TWithoutNegator & updCastAwayNegatorIfAny(T &t)
Definition: NTraits.h:788
static bool isNumericallyEqual(const T &a, const conjugate< R2 > &b)
Definition: NTraits.h:831
static double getDefaultTolerance()
Definition: NTraits.h:179
static double getDefaultTolerance()
Definition: NTraits.h:173
High precision mathematical and physical constants.
The purpose of the CNT<T> class is to hide the differences between built-in numerical types and compo...
static ScalarNormSq scalarNormSqr(const T &t)
Definition: NTraits.h:602
static const T & getOneThird()
Definition: NTraits.h:657
static bool isNumericallyEqual(const T &a, const double &b, double tol)
Definition: NTraits.h:843
complex< typename Widest< R1, R2 >::Type > Type
Definition: NTraits.h:114
double Precision
Definition: NTraits.h:140
conjugate< R > TRow
Definition: NTraits.h:716
static const T & getOneSeventh()
Definition: NTraits.h:661
long double Precision
Definition: NTraits.h:110
long double Type
Definition: NTraits.h:111
static bool isNumericallyEqual(const T &a, const float &b, double tol)
Definition: NTraits.h:841
ELEM max(const VectorBase< ELEM > &v)
Definition: VectorMath.h:251
long double Precision
Definition: NTraits.h:106
R ScalarNormSq
Definition: NTraits.h:541
static const TReal & real(const T &t)
Definition: NTraits.h:770
conjugate< R > THerm
Definition: NTraits.h:522
static TNeg & negate(T &t)
Definition: NTraits.h:776
static const T & getOne()
Definition: NTraits.h:652
static double getDefaultTolerance()
Definition: NTraits.h:630
static bool isNumericallyEqual(const T &a, int b, double tol)
Definition: NTraits.h:648
double Precision
Definition: NTraits.h:107
static const TImag & imag(const T &t)
Definition: NTraits.h:772
static const T & getInfinity()
Definition: NTraits.h:814
This class is specialized for all 36 combinations of standard types (that is, real and complex types ...
Definition: NTraits.h:135
static const T & getOneHalf()
Definition: NTraits.h:855
Widest< R1, R2 >::Precision Precision
Definition: NTraits.h:119
static const T & getE()
Definition: NTraits.h:666
static const float & getSignificant()
What multiple of attainable accuracy do we consider significant?
Definition: NTraits.h:165
complex< typename Narrowest< R1, R2 >::Type > Type
Definition: NTraits.h:150
long double Precision
Definition: NTraits.h:112
static const long double & getSignificant()
Definition: NTraits.h:178
static R & imag(T &t)
Definition: NTraits.h:584
RowVectorBase< typename CNT< ELEM >::TAbs > abs(const RowVectorBase< ELEM > &v)
Definition: VectorMath.h:120
bool isNaN(const negator< float > &x)
Definition: negator.h:273
Narrowest< R1, R2 >::Precision Precision
Definition: NTraits.h:147
P Type
Definition: NTraits.h:746
static const T & getOneFourth()
Definition: NTraits.h:658
static T * updData(T &t)
Definition: NTraits.h:769
Specialized information about Composite Numerical Types which allows us to define appropriate templat...
Definition: CompositeNumericalTypes.h:136
static const T & getNaN()
Definition: NTraits.h:612
static const TStandard & standardize(const T &t)
Definition: NTraits.h:608
conjugate< R > TElement
Definition: NTraits.h:715
SimTK_NTRAITS_CONJ_SPEC(float, float)
static bool isInf(const T &t)
Definition: NTraits.h:628
static const T & getCubeRoot3()
Definition: NTraits.h:873
static double getDefaultTolerance()
Definition: NTraits.h:829
bool isInf(const negator< float > &x)
Definition: negator.h:301
double Type
Definition: NTraits.h:108
static ScalarNormSq scalarNormSqr(const T &t)
Definition: NTraits.h:791
static bool isNumericallyEqual(const T &a, const complex< R2 > &b)
Definition: NTraits.h:835
static const T & getSqrt3()
Definition: NTraits.h:870
double Precision
Definition: NTraits.h:143
static const T & getLog10E()
Definition: NTraits.h:668
static const T & getOneEighth()
Definition: NTraits.h:861
static const T & getLog2E()
Definition: NTraits.h:866
Narrowest< R1, R2 >::Precision Precision
Definition: NTraits.h:155
static T * updData(T &t)
Definition: NTraits.h:580
long double Precision
Definition: NTraits.h:111
C StdNumber
Definition: NTraits.h:539
long double Type
Definition: NTraits.h:112
negator< T > TNeg
Definition: NTraits.h:706
complex< typename Narrowest< R1, R2 >::Type > Type
Definition: NTraits.h:154
CNT< typename CNT< P >::THerm >::template Result< C >::Mul Dvd
Definition: NTraits.h:551
static bool isNumericallyEqual(const T &a, const float &b, double tol)
Definition: NTraits.h:642
R Precision
Definition: NTraits.h:540
static bool isInf(const T &t)
Definition: NTraits.h:827
static const T & getOneOverPi()
Definition: NTraits.h:864
double Precision
Definition: NTraits.h:105
static const T & getOneOverPi()
Definition: NTraits.h:665
conjugate< R > Scalar
Definition: NTraits.h:725
long double Type
Definition: NTraits.h:110
C TPosTrans
Definition: NTraits.h:523
static const T * getData(const T &t)
Definition: NTraits.h:579
long double Precision
Definition: NTraits.h:109
C TSqrt
Definition: NTraits.h:530
static const T & getI()
Definition: NTraits.h:820
static const T & getOneHalf()
Definition: NTraits.h:656
R TSqTHerm
Definition: NTraits.h:525
R TSqHermT
Definition: NTraits.h:713
static bool isNumericallyEqual(const T &a, const complex< R2 > &b)
Definition: NTraits.h:632
static bool isNumericallyEqual(const T &a, const conjugate< R2 > &b, double tol)
Definition: NTraits.h:638
C TElement
Definition: NTraits.h:526
static const T & getLn10()
Definition: NTraits.h:875
double Precision
Definition: NTraits.h:108
static double getDefaultTolerance()
The default numerical error tolerance is always given in double precision.
Definition: NTraits.h:167
static const T * getData(const T &t)
Definition: NTraits.h:768
complex< typename Narrowest< R1, R2 >::Type > Type
Definition: NTraits.h:146
complex< R > TStandard
Definition: NTraits.h:721
static const T & getZero()
Definition: NTraits.h:850
float Type
Definition: NTraits.h:138
static const long double & getEps()
Definition: NTraits.h:177
static bool isNumericallyEqual(const T &a, const double &b)
Definition: NTraits.h:842
static const TWithoutNegator & castAwayNegatorIfAny(const T &t)
Definition: NTraits.h:597
double Precision
Definition: NTraits.h:141
negator< C > TNeg
Definition: NTraits.h:516
float Precision
Definition: NTraits.h:104
static bool isNumericallyEqual(const T &a, const complex< R2 > &b, double tol)
Definition: NTraits.h:634
static TPosTrans & positionalTranspose(T &t)
Definition: NTraits.h:594
static const T & getOneOverSqrt3()
Definition: NTraits.h:871
R TSqHermT
Definition: NTraits.h:524
static const R & real(const T &t)
Definition: NTraits.h:581
CNT< P >::template Result< C >::Add Add
Definition: NTraits.h:552
long double Precision
Definition: NTraits.h:144
float Type
Definition: NTraits.h:104
complex< R > StdNumber
Definition: NTraits.h:728
static const T & getLn2()
Definition: NTraits.h:874
static bool isNumericallyEqual(const T &a, const long double &b)
Definition: NTraits.h:844
static const T & getOneFifth()
Definition: NTraits.h:858
static const T & getI()
Definition: NTraits.h:621
float Precision
Definition: NTraits.h:139
bool isNumericallyEqual(const float &a, const float &b, double tol=RTraits< float >::getDefaultTolerance())
Compare two floats for approximate equality.
Definition: NTraits.h:313
C Number
Definition: NTraits.h:538
static bool isNumericallyEqual(const T &a, const long double &b)
Definition: NTraits.h:645
static bool isNumericallyEqual(const T &a, const float &b)
Definition: NTraits.h:840
static THerm & transpose(T &t)
Definition: NTraits.h:779