1#ifndef SimTK_SIMMATRIX_NTRAITS_H_
2#define SimTK_SIMMATRIX_NTRAITS_H_
68#if defined(__cpp_lib_constexpr_cmath) && __cpp_lib_constexpr_cmath >= 202202L
71 static_assert(std::numeric_limits<double>::is_iec559);
73 constexpr double max_double = std::numeric_limits<double>::max();
74 constexpr double nan = std::numeric_limits<double>::quiet_NaN();
78 if (x < 0.0)
return nan;
79 if (x == 0.0)
return x;
80 if (x > max_double)
return x;
84 if (x < std::numeric_limits<double>::min()) {
85 x *= 4503599627370496.0;
86 scale = 1.0 / 67108864.0;
89 auto b = std::bit_cast<std::uint64_t>(x);
90 b = (b + (1023ULL << 52)) >> 1;
91 auto g = std::bit_cast<double>(b);
95 const auto next = (g + x / g) * 0.5;
115template <
class R>
class conjugate;
120template <
class T>
class CNT;
123template <
class N>
class NTraits;
124template <
class R>
class NTraits< complex<R> >;
125template <
class R>
class NTraits< conjugate<R> >;
126template <>
class NTraits<float>;
127template <>
class NTraits<double>;
137template <
class N>
class negator;
146template <
class R1,
class R2>
struct Widest {};
151template <
class R1,
class R2>
struct Widest< complex<R1>,complex<R2> > {
152 typedef complex< typename Widest<R1,R2>::Type >
Type;
155template <
class R1,
class R2>
struct Widest< complex<R1>,R2 > {
156 typedef complex< typename Widest<R1,R2>::Type >
Type;
159template <
class R1,
class R2>
struct Widest< R1,complex<R2> > {
160 typedef complex< typename Widest<R1,R2>::Type >
Type;
178template <
class R1,
class R2>
struct Narrowest< complex<R1>,complex<R2> > {
179 typedef complex< typename Narrowest<R1,R2>::Type >
Type;
182template <
class R1,
class R2>
struct Narrowest< complex<R1>,R2 > {
183 typedef complex< typename Narrowest<R1,R2>::Type >
Type;
186template <
class R1,
class R2>
struct Narrowest< R1,complex<R2> > {
187 typedef complex< typename Narrowest<R1,R2>::Type >
Type;
196 static constexpr float getEps() {
return std::numeric_limits<float>::epsilon();}
207 static constexpr double getEps() {
return std::numeric_limits<double>::epsilon();}
233inline bool isNaN(
const float& x) {
return std::isnan(x);}
234inline bool isNaN(
const double& x) {
return std::isnan(x);}
236template <
class P>
inline bool
240template <
class P>
inline bool
242{
return isNaN(x.real()) ||
isNaN(x.negImag());}
259inline bool isFinite(
const float& x) {
return std::isfinite(x);}
260inline bool isFinite(
const double& x) {
return std::isfinite(x);}
262template <
class P>
inline bool
266template <
class P>
inline bool
287inline bool isInf(
const float& x) {
return std::isinf(x);}
288inline bool isInf(
const double& x) {
return std::isinf(x);}
290template <
class P>
inline bool
296template <
class P>
inline bool
298 return (
isInf(x.real()) && !
isNaN(x.negImag()))
346 const float scale = std::max(std::max(std::abs(a),std::abs(b)), 1.f);
347 return std::abs(a-b) <= scale*(float)tol; }
352 const double scale = std::max(std::max(std::abs(a),std::abs(b)), 1.);
353 return std::abs(a-b) <= scale*tol; }
384template <
class P,
class Q>
386 (
const std::complex<P>& a,
const std::complex<Q>& b,
394template <
class P,
class Q>
404template <
class P,
class Q>
414template <
class P,
class Q>
422template <
class P>
inline bool
427template <
class P>
inline bool
432template <
class P>
inline bool
437template <
class P>
inline bool
442template <
class P>
inline bool
447template <
class P>
inline bool
453template <
class P>
inline bool
458template <
class P>
inline bool
463template <
class P>
inline bool
468template <
class P>
inline bool
473template <
class P>
inline bool
478template <
class P>
inline bool
492template <
class R>
class NTraits< complex<R> > {
493 typedef complex<R> C;
529 template <
class P>
struct Result {
537 template <
class P>
struct Substitute {
550 RealStrideFactor = 2,
557 SignInterpretation = 1
561 static const R&
real(
const T& t) {
return (
reinterpret_cast<const R*
>(&t))[0]; }
562 static R&
real(
T& t) {
return (
reinterpret_cast<R*
>(&t))[0]; }
563 static const R&
imag(
const T& t) {
return (
reinterpret_cast<const R*
>(&t))[1]; }
564 static R&
imag(
T& t) {
return (
reinterpret_cast<R*
>(&t))[1]; }
573 {
return reinterpret_cast<const TPosTrans&
>(t);}
575 {
return reinterpret_cast<TPosTrans&
>(t);}
583 {
return t.real()*t.real() + t.imag()*t.imag(); }
585 {
return std::sqrt(t); }
587 {
return std::abs(t); }
595 static constexpr T getI() {
return T(0,1);}
651#define SimTK_BNTCMPLX_SPEC(T1,T2) \
652template<> template<> struct NTraits< complex<T1> >::Result<T2> { \
653 typedef Widest< complex<T1>,T2 >::Type W; \
654 typedef W Mul; typedef W Dvd; typedef W Add; typedef W Sub; \
656template<> template<> struct NTraits< complex<T1> >::Result< complex<T2> > { \
657 typedef Widest< complex<T1>,complex<T2> >::Type W; \
658 typedef W Mul; typedef W Dvd; typedef W Add; typedef W Sub; \
660template<> template<> struct NTraits< complex<T1> >::Result< conjugate<T2> > { \
661 typedef Widest< complex<T1>,complex<T2> >::Type W; \
662 typedef W Mul; typedef W Dvd; typedef W Add; typedef W Sub; \
666#undef SimTK_BNTCMPLX_SPEC
671 typedef complex<R> C;
705 template <
class P>
struct Result {
713 template <
class P>
struct Substitute {
726 RealStrideFactor = 2,
733 SignInterpretation = 1
750 {
return reinterpret_cast<const TPosTrans&
>(t);}
752 {
return reinterpret_cast<TPosTrans&
>(t);}
760 {
return t.real()*t.real() + t.negImag()*t.negImag(); }
762 {
return std::sqrt(C(t)); }
764 {
return std::abs(t.conj()); }
772 return reinterpret_cast<const TInvert&
>(cmplx); }
782 static constexpr T getI() {
return T(0,-1);}
851#define SimTK_NTRAITS_CONJ_SPEC(T1,T2) \
852template<> template<> struct NTraits< conjugate<T1> >::Result<T2> { \
853 typedef conjugate<Widest<T1,T2>::Type> W; \
854 typedef W Mul; typedef W Dvd; typedef W Add; typedef W Sub; \
856template<> template<> struct NTraits< conjugate<T1> >::Result<complex<T2> >{\
857 typedef Widest<complex<T1>,complex<T2> >::Type W; \
858 typedef W Mul; typedef W Dvd; typedef W Add; typedef negator<W> Sub; \
860template<> template<> struct NTraits< conjugate<T1> >::Result<conjugate<T2> >{\
861 typedef Widest<T1,T2>::Type W; typedef complex<W> WC; \
862 typedef negator<WC> Mul; typedef WC Dvd; typedef conjugate<W> Add; typedef WC Sub;\
866#undef SimTK_NTRAITS_CONJ_SPEC
875#define SimTK_DEFINE_REAL_NTRAITS(R) \
876template <> class NTraits<R> { \
879 typedef negator<T> TNeg; \
880 typedef T TWithoutNegator; \
883 typedef complex<T> TComplex; \
885 typedef T TPosTrans; \
886 typedef T TSqHermT; \
887 typedef T TSqTHerm; \
888 typedef T TElement; \
893 typedef T TStandard; \
895 typedef T TNormalize; \
897 typedef T ULessScalar; \
899 typedef T StdNumber; \
900 typedef T Precision; \
901 typedef T ScalarNormSq; \
902 template <class P> struct Result { \
903 typedef typename CNT<P>::template Result<R>::Mul Mul; \
904 typedef typename CNT< typename CNT<P>::THerm >::template Result<R>::Mul Dvd; \
905 typedef typename CNT<P>::template Result<R>::Add Add; \
906 typedef typename CNT< typename CNT<P>::TNeg >::template Result<R>::Add Sub; \
908 template <class P> struct Substitute { \
916 NPackedElements = 1, \
917 NActualElements = 1, \
918 NActualScalars = 1, \
920 RealStrideFactor = 1, \
921 ArgDepth = SCALAR_DEPTH, \
927 SignInterpretation = 1 \
929 static const T* getData(const T& t) { return &t; } \
930 static T* updData(T& t) { return &t; } \
931 static const T& real(const T& t) { return t; } \
932 static T& real(T& t) { return t; } \
933 static const T& imag(const T&) { static const T v{}; return v; } \
934 static T& imag(T&) { static T v{}; assert(false); return v; } \
935 static const TNeg& negate(const T& t) {return reinterpret_cast<const TNeg&>(t);} \
936 static TNeg& negate(T& t) {return reinterpret_cast<TNeg&>(t);} \
937 static const THerm& transpose(const T& t) {return reinterpret_cast<const THerm&>(t);} \
938 static THerm& transpose(T& t) {return reinterpret_cast<THerm&>(t);} \
939 static const TPosTrans& positionalTranspose(const T& t) \
940 {return reinterpret_cast<const TPosTrans&>(t);} \
941 static TPosTrans& positionalTranspose(T& t) \
942 {return reinterpret_cast<TPosTrans&>(t);} \
943 static const TWithoutNegator& castAwayNegatorIfAny(const T& t) \
944 {return reinterpret_cast<const TWithoutNegator&>(t);} \
945 static TWithoutNegator& updCastAwayNegatorIfAny(T& t) \
946 {return reinterpret_cast<TWithoutNegator&>(t);} \
947 static ScalarNormSq scalarNormSqr(const T& t) {return t*t;} \
948 static TSqrt sqrt(const T& t) {return std::sqrt(t);} \
949 static TAbs abs(const T& t) {return std::abs(t);} \
950 static const TStandard& standardize(const T& t) {return t;} \
951 static TNormalize normalize(const T& t) {return (t>0?T(1):(t<0?T(-1):getNaN()));} \
952 static TInvert invert(const T& t) {return T(1)/t;} \
954 static constexpr T getEps() {return RTraits<T>::getEps();} \
955 static constexpr T getSignificant() {return RTraits<T>::getSignificant();} \
956 static constexpr T getNaN() {return std::numeric_limits<T>::quiet_NaN();} \
957 static constexpr T getInfinity() {return std::numeric_limits<T>::infinity();} \
958 static constexpr T getLeastPositive() {return std::numeric_limits<T>::min();} \
959 static constexpr T getMostPositive() {return std::numeric_limits<T>::max();} \
960 static constexpr T getLeastNegative() {return -std::numeric_limits<T>::min();} \
961 static constexpr T getMostNegative() {return -std::numeric_limits<T>::max();} \
962 static constexpr T getSqrtEps() {return detail::consteval_sqrt(getEps());} \
963 static constexpr T getTiny() {constexpr auto s=detail::consteval_sqrt(getEps()); return getEps()*detail::consteval_sqrt(s);} \
964 static bool isFinite(const T& t) {return SimTK::isFinite(t);} \
965 static bool isNaN (const T& t) {return SimTK::isNaN(t);} \
966 static bool isInf (const T& t) {return SimTK::isInf(t);} \
969 static double getDefaultTolerance() {return RTraits<T>::getDefaultTolerance();} \
970 static bool isNumericallyEqual(const T& t, const float& f) {return SimTK::isNumericallyEqual(t,f);} \
971 static bool isNumericallyEqual(const T& t, const double& d) {return SimTK::isNumericallyEqual(t,d);} \
972 static bool isNumericallyEqual(const T& t, int i) {return SimTK::isNumericallyEqual(t,i);} \
974 static bool isNumericallyEqual(const T& t, const float& f, double tol){return SimTK::isNumericallyEqual(t,f,tol);} \
975 static bool isNumericallyEqual(const T& t, const double& d, double tol){return SimTK::isNumericallyEqual(t,d,tol);} \
976 static bool isNumericallyEqual(const T& t, int i, double tol){return SimTK::isNumericallyEqual(t,i,tol);} \
978 static constexpr T getZero() {return T(0);} \
979 static constexpr T getOne() {return T(1);} \
980 static constexpr T getMinusOne() {return T(-1);} \
981 static constexpr T getTwo() {return T(2);} \
982 static constexpr T getThree() {return T(3);} \
983 static constexpr T getOneHalf() {return T(0.5L);} \
984 static constexpr T getOneThird() {return T(1.L/3.L);} \
985 static constexpr T getOneFourth() {return T(0.25L);} \
986 static constexpr T getOneFifth() {return T(0.2L);} \
987 static constexpr T getOneSixth() {return T(1.L/6.L);} \
988 static constexpr T getOneSeventh() {return T(1.L/7.L);} \
989 static constexpr T getOneEighth() {return T(0.125L);} \
990 static constexpr T getOneNinth() {return T(1.L/9.L);} \
991 static constexpr T getPi() {return T(SimTK_PI);} \
992 static constexpr T getOneOverPi() {return T(1.L/SimTK_PI);} \
993 static constexpr T getE() {return T(SimTK_E);} \
994 static constexpr T getLog2E() {return T(SimTK_LOG2E);} \
995 static constexpr T getLog10E() {return T(SimTK_LOG10E);} \
996 static constexpr T getSqrt2() {return T(SimTK_SQRT2);} \
997 static constexpr T getOneOverSqrt2() {return T(1.L/SimTK_SQRT2);} \
998 static constexpr T getSqrt3() {return T(SimTK_SQRT3);} \
999 static constexpr T getOneOverSqrt3() {return T(1.L/SimTK_SQRT3);} \
1000 static constexpr T getCubeRoot2() {return T(SimTK_CBRT2);} \
1001 static constexpr T getCubeRoot3() {return T(SimTK_CBRT3);} \
1002 static constexpr T getLn2() {return T(SimTK_LN2);} \
1003 static constexpr T getLn10() {return T(SimTK_LN10);} \
1005 static constexpr int getNumDigits() {return std::numeric_limits<T>::digits10;} \
1006 static constexpr int getLosslessNumDigits() {return (int)(5.0L*(std::numeric_limits<T>::digits-1)/4.0L*(SimTK_LN2/SimTK_LN10)+0.5L);} \
1008template<> struct NTraits<R>::Result<float> \
1009 {typedef Widest<R,float>::Type Mul;typedef Mul Dvd;typedef Mul Add;typedef Mul Sub;}; \
1010template<> struct NTraits<R>::Result<double> \
1011 {typedef Widest<R,double>::Type Mul;typedef Mul Dvd;typedef Mul Add;typedef Mul Sub;}; \
1012template<> struct NTraits<R>::Result<complex<float> > \
1013 {typedef Widest<R,complex<float> >::Type Mul;typedef Mul Dvd;typedef Mul Add;typedef Mul Sub;}; \
1014template<> struct NTraits<R>::Result<complex<double> > \
1015 {typedef Widest<R,complex<double> >::Type Mul;typedef Mul Dvd;typedef Mul Add;typedef Mul Sub;}; \
1016template<> struct NTraits<R>::Result<conjugate<float> > \
1017 {typedef conjugate<Widest<R,float>::Type> Mul;typedef Mul Dvd;typedef Mul Add;typedef Mul Sub;}; \
1018template<> struct NTraits<R>::Result<conjugate<double> > \
1019 {typedef conjugate<Widest<R,double>::Type> Mul;typedef Mul Dvd;typedef Mul Add;typedef Mul Sub;}
1021#if defined(__clang__)
1022#pragma clang diagnostic push
1024#pragma clang diagnostic ignored "-Wnull-dereference"
1028#if defined(__clang__)
1029#pragma clang diagnostic pop
1032#undef SimTK_DEFINE_REAL_NTRAITS
1035template <
class R>
class CNT< complex<R> > :
public NTraits< complex<R> > { };
The purpose of the CNT<T> class is to hide the differences between built-in numerical types and compo...
High precision mathematical and physical constants.
#define SimTK_BNTCMPLX_SPEC(T1, T2)
Definition NTraits.h:651
#define SimTK_NTRAITS_CONJ_SPEC(T1, T2)
Definition NTraits.h:851
#define SimTK_DEFINE_REAL_NTRAITS(R)
Definition NTraits.h:875
Specialized information about Composite Numerical Types which allows us to define appropriate templat...
Definition CompositeNumericalTypes.h:136
static const TPosTrans & positionalTranspose(const T &t)
Definition NTraits.h:572
static constexpr T getOneNinth()
Definition NTraits.h:632
static TInvert invert(const T &t)
Definition NTraits.h:590
static bool isNumericallyEqual(const T &a, const conjugate< R2 > &b, double tol)
Definition NTraits.h:609
C T
Definition NTraits.h:495
C ULessScalar
Definition NTraits.h:517
static const R & imag(const T &t)
Definition NTraits.h:563
C TNormalize
Definition NTraits.h:514
static constexpr T getOneEighth()
Definition NTraits.h:631
static R & imag(T &t)
Definition NTraits.h:564
static TAbs abs(const T &t)
Definition NTraits.h:586
R TSqTHerm
Definition NTraits.h:505
static bool isNumericallyEqual(const T &a, const complex< R2 > &b)
Definition NTraits.h:603
static constexpr T getSqrt2()
Definition NTraits.h:638
static TNeg & negate(T &t)
Definition NTraits.h:567
static constexpr T getLn10()
Definition NTraits.h:645
C TCol
Definition NTraits.h:508
static constexpr T getE()
Definition NTraits.h:635
static constexpr T getOneOverPi()
Definition NTraits.h:634
R ScalarNormSq
Definition NTraits.h:521
static constexpr T getOneOverSqrt3()
Definition NTraits.h:641
static const R & real(const T &t)
Definition NTraits.h:561
static bool isNumericallyEqual(const T &a, const double &b)
Definition NTraits.h:614
static THerm & transpose(T &t)
Definition NTraits.h:570
static bool isNumericallyEqual(const T &a, int b)
Definition NTraits.h:616
static const TStandard & standardize(const T &t)
Definition NTraits.h:588
static const THerm & transpose(const T &t)
Definition NTraits.h:569
static bool isNumericallyEqual(const T &a, const conjugate< R2 > &b)
Definition NTraits.h:607
C Scalar
Definition NTraits.h:516
static bool isFinite(const T &t)
Definition NTraits.h:597
static T * updData(T &t)
Definition NTraits.h:560
static ScalarNormSq scalarNormSqr(const T &t)
Definition NTraits.h:582
static R & real(T &t)
Definition NTraits.h:562
static constexpr T getOneSeventh()
Definition NTraits.h:630
static constexpr T getSqrt3()
Definition NTraits.h:640
static constexpr T getZero()
Definition NTraits.h:620
conjugate< R > THerm
Definition NTraits.h:502
static const T * getData(const T &t)
Definition NTraits.h:559
static constexpr T getLn2()
Definition NTraits.h:644
static bool isInf(const T &t)
Definition NTraits.h:599
static constexpr T getCubeRoot2()
Definition NTraits.h:642
static bool isNumericallyEqual(const T &a, const double &b, double tol)
Definition NTraits.h:615
static constexpr T getNaN()
Definition NTraits.h:592
static const TWithoutNegator & castAwayNegatorIfAny(const T &t)
Definition NTraits.h:577
static bool isNumericallyEqual(const T &a, int b, double tol)
Definition NTraits.h:617
static constexpr T getOneHalf()
Definition NTraits.h:625
static constexpr T getInfinity()
Definition NTraits.h:593
R TImag
Definition NTraits.h:500
C StdNumber
Definition NTraits.h:519
C TStandard
Definition NTraits.h:512
static TNormalize normalize(const T &t)
Definition NTraits.h:589
static TPosTrans & positionalTranspose(T &t)
Definition NTraits.h:574
static bool isNaN(const T &t)
Definition NTraits.h:598
negator< C > TNeg
Definition NTraits.h:496
C Number
Definition NTraits.h:518
static constexpr T getOneFifth()
Definition NTraits.h:628
static constexpr T getTwo()
Definition NTraits.h:623
static constexpr T getOneFourth()
Definition NTraits.h:627
static constexpr T getLog10E()
Definition NTraits.h:637
C TComplex
Definition NTraits.h:501
C TElement
Definition NTraits.h:506
static constexpr T getMinusOne()
Definition NTraits.h:622
static constexpr T getOneSixth()
Definition NTraits.h:629
static constexpr T getLog2E()
Definition NTraits.h:636
static TSqrt sqrt(const T &t)
Definition NTraits.h:584
C TSqrt
Definition NTraits.h:510
R Precision
Definition NTraits.h:520
C TInvert
Definition NTraits.h:513
static bool isNumericallyEqual(const T &a, const float &b, double tol)
Definition NTraits.h:613
static const TNeg & negate(const T &t)
Definition NTraits.h:566
static constexpr T getPi()
Definition NTraits.h:633
static constexpr T getOne()
Definition NTraits.h:621
static double getDefaultTolerance()
Definition NTraits.h:601
C TWithoutNegator
Definition NTraits.h:497
static TWithoutNegator & updCastAwayNegatorIfAny(T &t)
Definition NTraits.h:579
static constexpr T getOneThird()
Definition NTraits.h:626
R TAbs
Definition NTraits.h:511
C TPosTrans
Definition NTraits.h:503
static constexpr T getOneOverSqrt2()
Definition NTraits.h:639
R TSqHermT
Definition NTraits.h:504
static constexpr T getI()
Definition NTraits.h:595
static constexpr T getCubeRoot3()
Definition NTraits.h:643
static bool isNumericallyEqual(const T &a, const complex< R2 > &b, double tol)
Definition NTraits.h:605
C TRow
Definition NTraits.h:507
static bool isNumericallyEqual(const T &a, const float &b)
Definition NTraits.h:612
R TReal
Definition NTraits.h:499
static constexpr T getThree()
Definition NTraits.h:624
static constexpr T getOneOverPi()
Definition NTraits.h:821
conjugate< R > TInvert
Definition NTraits.h:690
static constexpr T getMinusOne()
Definition NTraits.h:809
static ScalarNormSq scalarNormSqr(const T &t)
Definition NTraits.h:759
static constexpr T getCubeRoot2()
Definition NTraits.h:829
static constexpr T getInfinity()
Definition NTraits.h:779
static bool isNumericallyEqual(const T &a, const float &b)
Definition NTraits.h:799
conjugate< R > T
Definition NTraits.h:673
conjugate< R > Scalar
Definition NTraits.h:693
static bool isFinite(const T &t)
Definition NTraits.h:784
static bool isNumericallyEqual(const T &a, const float &b, double tol)
Definition NTraits.h:800
static TReal & real(T &t)
Definition NTraits.h:739
conjugate< R > TCol
Definition NTraits.h:685
static const TReal & real(const T &t)
Definition NTraits.h:738
conjugate< R > TElement
Definition NTraits.h:683
conjugate< R > TPosTrans
Definition NTraits.h:680
conjugate< R > TNormalize
Definition NTraits.h:691
static constexpr T getOneThird()
Definition NTraits.h:813
static constexpr T getOneNinth()
Definition NTraits.h:819
static TInvert invert(const T &t)
Definition NTraits.h:770
static constexpr T getOneHalf()
Definition NTraits.h:812
static const TImag & imag(const T &t)
Definition NTraits.h:740
static constexpr T getE()
Definition NTraits.h:822
static TPosTrans & positionalTranspose(T &t)
Definition NTraits.h:751
static constexpr T getLn2()
Definition NTraits.h:831
static const TPosTrans & positionalTranspose(const T &t)
Definition NTraits.h:749
conjugate< R > ULessScalar
Definition NTraits.h:694
static constexpr T getCubeRoot3()
Definition NTraits.h:830
static bool isNumericallyEqual(const T &a, const complex< R2 > &b)
Definition NTraits.h:794
static TSqrt sqrt(const T &t)
Definition NTraits.h:761
static TImag & imag(T &t)
Definition NTraits.h:741
conjugate< R > Number
Definition NTraits.h:695
static bool isNumericallyEqual(const T &a, int b)
Definition NTraits.h:803
static const TNeg & negate(const T &t)
Definition NTraits.h:743
static const TWithoutNegator & castAwayNegatorIfAny(const T &t)
Definition NTraits.h:754
R Precision
Definition NTraits.h:697
static const T * getData(const T &t)
Definition NTraits.h:736
static constexpr T getSqrt2()
Definition NTraits.h:825
R TAbs
Definition NTraits.h:688
static constexpr T getOneEighth()
Definition NTraits.h:818
static constexpr T getOneFifth()
Definition NTraits.h:815
static constexpr T getLog2E()
Definition NTraits.h:823
static bool isNumericallyEqual(const T &a, const double &b)
Definition NTraits.h:801
static constexpr T getOneSixth()
Definition NTraits.h:816
static constexpr T getLog10E()
Definition NTraits.h:824
static TAbs abs(const T &t)
Definition NTraits.h:763
R ScalarNormSq
Definition NTraits.h:698
static constexpr T getZero()
Definition NTraits.h:807
static constexpr T getSqrt3()
Definition NTraits.h:827
static constexpr T getOneOverSqrt3()
Definition NTraits.h:828
complex< R > THerm
Definition NTraits.h:679
conjugate< R > TRow
Definition NTraits.h:684
static constexpr T getNaN()
Definition NTraits.h:776
static T * updData(T &t)
Definition NTraits.h:737
static constexpr T getOneOverSqrt2()
Definition NTraits.h:826
static bool isNumericallyEqual(const T &a, const conjugate< R2 > &b, double tol)
Definition NTraits.h:792
static const THerm & transpose(const T &t)
Definition NTraits.h:746
R TSqHermT
Definition NTraits.h:681
static TStandard standardize(const T &t)
Definition NTraits.h:765
static constexpr T getPi()
Definition NTraits.h:820
static bool isNaN(const T &t)
Definition NTraits.h:785
static bool isNumericallyEqual(const T &a, const double &b, double tol)
Definition NTraits.h:802
complex< R > TStandard
Definition NTraits.h:689
static constexpr T getOneFourth()
Definition NTraits.h:814
static constexpr T getTwo()
Definition NTraits.h:810
conjugate< R > TWithoutNegator
Definition NTraits.h:675
static bool isNumericallyEqual(const T &a, const complex< R2 > &b, double tol)
Definition NTraits.h:796
R TSqTHerm
Definition NTraits.h:682
static bool isInf(const T &t)
Definition NTraits.h:786
static constexpr T getOne()
Definition NTraits.h:808
R TReal
Definition NTraits.h:676
static constexpr T getI()
Definition NTraits.h:782
static double getDefaultTolerance()
Definition NTraits.h:788
static constexpr T getLn10()
Definition NTraits.h:832
complex< R > TSqrt
Definition NTraits.h:687
static bool isNumericallyEqual(const T &a, int b, double tol)
Definition NTraits.h:804
static constexpr T getOneSeventh()
Definition NTraits.h:817
static constexpr T getThree()
Definition NTraits.h:811
static TNormalize normalize(const T &t)
Definition NTraits.h:767
static TWithoutNegator & updCastAwayNegatorIfAny(T &t)
Definition NTraits.h:756
conjugate< R > TComplex
Definition NTraits.h:678
complex< R > StdNumber
Definition NTraits.h:696
static TNeg & negate(T &t)
Definition NTraits.h:744
static THerm & transpose(T &t)
Definition NTraits.h:747
negator< R > TImag
Definition NTraits.h:677
negator< T > TNeg
Definition NTraits.h:674
static bool isNumericallyEqual(const T &a, const conjugate< R2 > &b)
Definition NTraits.h:790
static constexpr double getEps()
Definition NTraits.h:207
static constexpr double getSignificant()
Definition NTraits.h:208
static constexpr double getDefaultTolerance()
Definition NTraits.h:212
static constexpr float getSignificant()
What multiple of attainable accuracy do we consider significant?
Definition NTraits.h:198
static constexpr double getDefaultTolerance()
The default numerical error tolerance is always given in double precision.
Definition NTraits.h:203
static constexpr float getEps()
Attainable accuracy at this precision.
Definition NTraits.h:196
RTraits is a helper class for NTraits.
Definition NTraits.h:192
SimTK::conjugate<R> should be instantiated only for float, double.
Definition conjugate.h:178
negator<N>, where N is a number type (real, complex, conjugate), is represented in memory identically...
Definition negator.h:75
consteval double consteval_sqrt(double x) noexcept
Definition NTraits.h:67
This is the top-level SimTK namespace into which all SimTK names are placed to avoid collision with o...
Definition Assembler.h:37
RowVectorBase< typename CNT< ELEM >::TAbs > abs(const RowVectorBase< ELEM > &v)
Definition VectorMath.h:120
bool isInf(const negator< float > &x)
Definition negator.h:298
@ SCALAR_DEPTH
Definition CompositeNumericalTypes.h:116
bool isNumericallyEqual(const float &a, const float &b, double tol=RTraits< float >::getDefaultTolerance())
Compare two floats for approximate equality.
Definition NTraits.h:343
bool isNaN(const negator< float > &x)
Definition negator.h:272
bool isFinite(const negator< float > &x)
Definition negator.h:285
CNT< typenameCNT< P >::THerm >::template Result< C >::Mul Dvd
Definition NTraits.h:531
CNT< P >::template Result< C >::Mul Mul
Definition NTraits.h:530
CNT< typenameCNT< P >::TNeg >::template Result< C >::Add Sub
Definition NTraits.h:533
CNT< P >::template Result< C >::Add Add
Definition NTraits.h:532
P Type
Definition NTraits.h:538
CNT< P >::template Result< T >::Add Add
Definition NTraits.h:708
CNT< typenameCNT< P >::TNeg >::template Result< T >::Add Sub
Definition NTraits.h:709
CNT< P >::template Result< T >::Mul Mul
Definition NTraits.h:706
CNT< typenameCNT< P >::THerm >::template Result< T >::Mul Dvd
Definition NTraits.h:707
P Type
Definition NTraits.h:714
Narrowest< R1, R2 >::Precision Precision
Definition NTraits.h:188
complex< typename Narrowest< R1, R2 >::Type > Type
Definition NTraits.h:187
complex< typename Narrowest< R1, R2 >::Type > Type
Definition NTraits.h:183
Narrowest< R1, R2 >::Precision Precision
Definition NTraits.h:184
Narrowest< R1, R2 >::Precision Precision
Definition NTraits.h:180
complex< typename Narrowest< R1, R2 >::Type > Type
Definition NTraits.h:179
double Type
Definition NTraits.h:177
double Precision
Definition NTraits.h:177
float Type
Definition NTraits.h:176
float Precision
Definition NTraits.h:176
float Type
Definition NTraits.h:175
float Precision
Definition NTraits.h:175
float Precision
Definition NTraits.h:174
float Type
Definition NTraits.h:174
This class is specialized for all 16 combinations of standard types (that is, real and complex types ...
Definition NTraits.h:173
Widest< R1, R2 >::Precision Precision
Definition NTraits.h:161
complex< typename Widest< R1, R2 >::Type > Type
Definition NTraits.h:160
complex< typename Widest< R1, R2 >::Type > Type
Definition NTraits.h:156
Widest< R1, R2 >::Precision Precision
Definition NTraits.h:157
complex< typename Widest< R1, R2 >::Type > Type
Definition NTraits.h:152
Widest< R1, R2 >::Precision Precision
Definition NTraits.h:153
double Precision
Definition NTraits.h:150
double Type
Definition NTraits.h:150
double Precision
Definition NTraits.h:149
double Type
Definition NTraits.h:149
double Precision
Definition NTraits.h:148
double Type
Definition NTraits.h:148
float Type
Definition NTraits.h:147
float Precision
Definition NTraits.h:147
This class is specialized for all 16 combinations of standard types (that is, real and complex types ...
Definition NTraits.h:146