49 #ifndef _TEUCHOS_SCALARTRAITS_HPP_ 50 #define _TEUCHOS_SCALARTRAITS_HPP_ 58 #ifdef HAVE_TEUCHOS_ARPREC 59 #include <arprec/mp_real.h> 62 #ifdef HAVE_TEUCHOSCORE_QUADMATH 80 operator<< (std::ostream& out,
const __float128& x);
96 #endif // HAVE_TEUCHOSCORE_QUADMATH 98 #ifdef HAVE_TEUCHOS_QD 99 #include <qd/qd_real.h> 100 #include <qd/dd_real.h> 103 #ifdef HAVE_TEUCHOS_GNU_MP 115 #ifndef DOXYGEN_SHOULD_SKIP_THIS 119 void throwScalarTraitsNanInfError(
const std::string &errMsg );
122 template<
class Scalar>
123 bool generic_real_isnaninf(
const Scalar &x)
125 #ifdef HAVE_TEUCHOSCORE_CXX11 126 if (std::isnan(x))
return true;
127 if (std::isinf(x))
return true;
130 typedef std::numeric_limits<Scalar> STD_NL;
132 const Scalar tol = 1.0;
133 if (!(x <= tol) && !(x > tol))
return true;
135 Scalar z =
static_cast<Scalar
>(0.0) * x;
136 if (!(z <= tol) && !(z > tol))
return true;
138 if (x == STD_NL::infinity() || x == -STD_NL::infinity())
return true;
145 #define TEUCHOS_SCALAR_TRAITS_NAN_INF_ERR( VALUE, MSG ) \ 146 if (isnaninf(VALUE)) { \ 147 std::ostringstream omsg; \ 149 Teuchos::throwScalarTraitsNanInfError(omsg.str()); \ 154 struct ScalarTraits<char>
164 static inline magnitudeType magnitude(
char a) {
return static_cast<char>(std::fabs(static_cast<double>(a))); }
165 static inline char zero() {
return 0; }
166 static inline char one() {
return 1; }
167 static inline char conjugate(
char x) {
return x; }
168 static inline char real(
char x) {
return x; }
169 static inline char imag(
char) {
return 0; }
170 static inline bool isnaninf(
char ) {
return false; }
171 static inline void seedrandom(
unsigned int s) {
180 static inline char random() {
return std::rand(); }
181 static inline std::string
name() {
return "char"; }
182 static inline char squareroot(
char x) {
return (
char) std::sqrt((
double) x); }
183 static inline char pow(
char x,
char y) {
return (
char) std::pow((
double)x,(
double)y); }
184 static inline char log(
char x) {
return static_cast<char> (std::log (static_cast<double> (x))); }
185 static inline char log10(
char x) {
return static_cast<char> (std::log10 (static_cast<double> (x))); }
190 struct ScalarTraits<short int>
200 static inline magnitudeType magnitude(
short int a) {
return static_cast<short int>(std::fabs(static_cast<double>(a))); }
201 static inline short int zero() {
return 0; }
202 static inline short int one() {
return 1; }
203 static inline short int conjugate(
short int x) {
return x; }
204 static inline short int real(
short int x) {
return x; }
205 static inline short int imag(
short int) {
return 0; }
206 static inline bool isnaninf(
short int) {
return false; }
207 static inline void seedrandom(
unsigned int s) {
216 static inline short int random() {
return std::rand(); }
217 static inline std::string
name() {
return "short int"; }
218 static inline short int squareroot(
short int x) {
return (
short int) std::sqrt((
double) x); }
219 static inline short int pow(
short int x,
short int y) {
return (
short int) std::pow((
double)x,(
double)y); }
220 static inline short int log(
short int x) {
return static_cast<short int> (std::log (static_cast<double> (x))); }
221 static inline short int log10(
short int x) {
return static_cast<short int> (std::log10 (static_cast<double> (x))); }
225 struct ScalarTraits<unsigned short int>
235 static inline magnitudeType magnitude(
unsigned short int a) {
return static_cast<unsigned short int>(std::fabs(static_cast<double>(a))); }
236 static inline unsigned short int zero() {
return 0; }
237 static inline unsigned short int one() {
return 1; }
238 static inline unsigned short int conjugate(
unsigned short int x) {
return x; }
239 static inline unsigned short int real(
unsigned short int x) {
return x; }
240 static inline unsigned short int imag(
unsigned short int) {
return 0; }
241 static inline bool isnaninf(
unsigned short int) {
return false; }
242 static inline void seedrandom(
unsigned int s) {
251 static inline unsigned short int random() {
return std::rand(); }
252 static inline std::string
name() {
return "unsigned short int"; }
253 static inline unsigned short int squareroot(
unsigned short int x) {
return (
unsigned short int) std::sqrt((
double) x); }
254 static inline unsigned short int pow(
unsigned short int x,
unsigned short int y) {
return (
unsigned short int) std::pow((
double)x,(
double)y); }
255 static inline unsigned short int log(
unsigned short int x) {
return static_cast<unsigned short int> (std::log (static_cast<double> (x))); }
256 static inline unsigned short int log10(
unsigned short int x) {
return static_cast<unsigned short int> (std::log10 (static_cast<double> (x))); }
261 struct ScalarTraits<int>
271 static inline magnitudeType magnitude(
int a) {
return static_cast<int>(std::fabs(static_cast<double>(a))); }
272 static inline int zero() {
return 0; }
273 static inline int one() {
return 1; }
274 static inline int conjugate(
int x) {
return x; }
275 static inline int real(
int x) {
return x; }
276 static inline int imag(
int) {
return 0; }
277 static inline bool isnaninf(
int) {
return false; }
278 static inline void seedrandom(
unsigned int s) {
287 static inline int random() {
return std::rand(); }
288 static inline std::string
name() {
return "int"; }
289 static inline int squareroot(
int x) {
return (
int) std::sqrt((
double) x); }
290 static inline int pow(
int x,
int y) {
return (
int) std::pow((
double)x,(
double)y); }
291 static inline int log(
int x) {
return static_cast<int> (std::log (static_cast<double> (x))); }
292 static inline int log10(
int x) {
return static_cast<int> (std::log10 (static_cast<double> (x))); }
297 struct ScalarTraits<unsigned int>
307 static inline magnitudeType magnitude(
unsigned int a) {
return static_cast<unsigned int>(std::fabs(static_cast<double>(a))); }
308 static inline unsigned int zero() {
return 0; }
309 static inline unsigned int one() {
return 1; }
310 static inline unsigned int conjugate(
unsigned int x) {
return x; }
311 static inline unsigned int real(
unsigned int x) {
return x; }
312 static inline unsigned int imag(
unsigned int) {
return 0; }
313 static inline bool isnaninf(
unsigned int) {
return false; }
314 static inline void seedrandom(
unsigned int s) {
323 static inline unsigned int random() {
return std::rand(); }
324 static inline std::string
name() {
return "unsigned int"; }
325 static inline unsigned int squareroot(
unsigned int x) {
return (
unsigned int) std::sqrt((
double) x); }
326 static inline unsigned int pow(
unsigned int x,
unsigned int y) {
return (
unsigned int) std::pow((
double)x,(
double)y); }
327 static inline unsigned int log(
unsigned int x) {
return static_cast<unsigned int> (std::log (static_cast<double> (x))); }
328 static inline unsigned int log10(
unsigned int x) {
return static_cast<unsigned int> (std::log10 (static_cast<double> (x))); }
333 struct ScalarTraits<long int>
343 static inline magnitudeType magnitude(
long int a) {
return static_cast<long int>(std::fabs(static_cast<double>(a))); }
344 static inline long int zero() {
return 0; }
345 static inline long int one() {
return 1; }
346 static inline long int conjugate(
long int x) {
return x; }
347 static inline long int real(
long int x) {
return x; }
348 static inline long int imag(
long int) {
return 0; }
349 static inline bool isnaninf(
long int) {
return false; }
350 static inline void seedrandom(
unsigned int s) {
359 static inline long int random() {
return std::rand(); }
360 static inline std::string
name() {
return "long int"; }
361 static inline long int squareroot(
long int x) {
return (
long int) std::sqrt((
double) x); }
362 static inline long int pow(
long int x,
long int y) {
return (
long int) std::pow((
double)x,(
double)y); }
365 static inline long int log(
long int x) {
return static_cast<long int> (std::log (static_cast<double> (x))); }
366 static inline long int log10(
long int x) {
return static_cast<long int> (std::log10 (static_cast<double> (x))); }
371 struct ScalarTraits<long unsigned int>
381 static inline magnitudeType magnitude(
long unsigned int a) {
return static_cast<long unsigned int>(std::fabs(static_cast<double>(a))); }
382 static inline long unsigned int zero() {
return 0; }
383 static inline long unsigned int one() {
return 1; }
384 static inline long unsigned int conjugate(
long unsigned int x) {
return x; }
385 static inline long unsigned int real(
long unsigned int x) {
return x; }
386 static inline long unsigned int imag(
long unsigned int) {
return 0; }
387 static inline bool isnaninf(
long unsigned int) {
return false; }
388 static inline void seedrandom(
unsigned int s) {
397 static inline long unsigned int random() {
return std::rand(); }
398 static inline std::string
name() {
return "long unsigned int"; }
399 static inline long unsigned int squareroot(
long unsigned int x) {
return (
long unsigned int) std::sqrt((
double) x); }
400 static inline long unsigned int pow(
long unsigned int x,
long unsigned int y) {
return (
long unsigned int) std::pow((
double)x,(
double)y); }
403 static inline long unsigned int log(
long unsigned int x) {
return static_cast<long unsigned int> (std::log (static_cast<double> (x))); }
404 static inline long unsigned int log10(
long unsigned int x) {
return static_cast<long unsigned int> (std::log10 (static_cast<double> (x))); }
408 #ifdef HAVE_TEUCHOS_LONG_LONG_INT 410 struct ScalarTraits<long long int>
420 static inline magnitudeType magnitude(
long long int a) {
return static_cast<long long int>(std::fabs(static_cast<double>(a))); }
421 static inline long long int zero() {
return 0; }
422 static inline long long int one() {
return 1; }
423 static inline long long int conjugate(
long long int x) {
return x; }
424 static inline long long int real(
long long int x) {
return x; }
425 static inline long long int imag(
long long int) {
return 0; }
426 static inline bool isnaninf(
long long int) {
return false; }
427 static inline void seedrandom(
unsigned int s) {
436 static inline long long int random() {
return std::rand(); }
437 static inline std::string
name() {
return "long long int"; }
438 static inline long long int squareroot(
long long int x) {
return (
long long int) std::sqrt((
double) x); }
439 static inline long long int pow(
long long int x,
long long int y) {
return (
long long int) std::pow((
double)x,(
double)y); }
442 static inline long long int log(
long long int x) {
return static_cast<long long int> (std::log (static_cast<double> (x))); }
443 static inline long long int log10(
long long int x) {
return static_cast<long long int> (std::log10 (static_cast<double> (x))); }
447 struct ScalarTraits<unsigned long long int>
457 static inline magnitudeType magnitude(
unsigned long long int a) {
return static_cast<unsigned long long int>(std::fabs(static_cast<double>(a))); }
458 static inline unsigned long long int zero() {
return 0; }
459 static inline unsigned long long int one() {
return 1; }
460 static inline unsigned long long int conjugate(
unsigned long long int x) {
return x; }
461 static inline unsigned long long int real(
unsigned long long int x) {
return x; }
462 static inline unsigned long long int imag(
unsigned long long int) {
return 0; }
463 static inline bool isnaninf(
unsigned long long int) {
return false; }
464 static inline void seedrandom(
unsigned int s) {
473 static inline unsigned long long int random() {
return std::rand(); }
474 static inline std::string
name() {
return "unsigned long long int"; }
475 static inline unsigned long long int squareroot(
unsigned long long int x) {
return (
unsigned long long int) std::sqrt((
double) x); }
476 static inline unsigned long long int pow(
unsigned long long int x,
unsigned long long int y) {
return (
unsigned long long int) std::pow((
double)x,(
double)y); }
479 static inline unsigned long long int log(
unsigned long long int x) {
return static_cast<unsigned long long int> (std::log (static_cast<double> (x))); }
480 static inline unsigned long long int log10(
unsigned long long int x) {
return static_cast<unsigned long long int> (std::log10 (static_cast<double> (x))); }
482 #endif // HAVE_TEUCHOS_LONG_LONG_INT 485 #ifdef HAVE_TEUCHOS___INT64 488 struct ScalarTraits<__int64>
498 static inline magnitudeType magnitude(__int64 a) {
return static_cast<__int64
>(std::fabs(static_cast<double>(a))); }
499 static inline __int64
zero() {
return 0; }
500 static inline __int64
one() {
return 1; }
501 static inline __int64
conjugate(__int64 x) {
return x; }
502 static inline __int64
real(__int64 x) {
return x; }
503 static inline __int64
imag(__int64) {
return 0; }
504 static inline void seedrandom(
unsigned int s) {
513 static inline __int64
random() {
return std::rand(); }
514 static inline std::string
name() {
return "__int64"; }
515 static inline __int64
squareroot(__int64 x) {
return (__int64) std::sqrt((
double) x); }
516 static inline __int64
pow(__int64 x, __int64 y) {
return (__int64) std::pow((
double)x,(
double)y); }
519 static inline __int64 log(__int64 x) {
return static_cast<__int64
> (std::log (static_cast<double> (x))); }
520 static inline __int64 log10(__int64 x) {
return static_cast<__int64
> (std::log10 (static_cast<double> (x))); }
524 struct ScalarTraits<unsigned __int64>
534 static inline magnitudeType magnitude(
unsigned __int64 a) {
return static_cast<unsigned __int64
>(std::fabs(static_cast<double>(a))); }
535 static inline unsigned __int64
zero() {
return 0; }
536 static inline unsigned __int64
one() {
return 1; }
537 static inline unsigned __int64
conjugate(
unsigned __int64 x) {
return x; }
538 static inline unsigned __int64
real(
unsigned __int64 x) {
return x; }
539 static inline unsigned __int64
imag(
unsigned __int64) {
return 0; }
540 static inline void seedrandom(
unsigned int s) {
549 static inline unsigned __int64
random() {
return std::rand(); }
550 static inline std::string
name() {
return "unsigned __int64"; }
551 static inline unsigned __int64
squareroot(
unsigned __int64 x) {
return (
unsigned __int64) std::sqrt((
double) x); }
552 static inline unsigned __int64
pow(
unsigned __int64 x,
unsigned __int64 y) {
return (
unsigned __int64) std::pow((
double)x,(
double)y); }
555 static inline unsigned __int64 log(
unsigned __int64 x) {
return static_cast<unsigned __int64
> (std::log (static_cast<double> (x))); }
556 static inline unsigned __int64 log10(
unsigned __int64 x) {
return static_cast<unsigned __int64
> (std::log10 (static_cast<double> (x))); }
559 #endif // HAVE_TEUCHOS___INT64 568 struct ScalarTraits<float>
577 static inline float eps() {
578 return std::numeric_limits<float>::epsilon();
580 static inline float sfmin() {
581 return std::numeric_limits<float>::min();
583 static inline float base() {
584 return static_cast<float>(std::numeric_limits<float>::radix);
586 static inline float prec() {
589 static inline float t() {
590 return static_cast<float>(std::numeric_limits<float>::digits);
592 static inline float rnd() {
593 return ( std::numeric_limits<float>::round_style == std::round_to_nearest ?
one() :
zero() );
595 static inline float emin() {
596 return static_cast<float>(std::numeric_limits<float>::min_exponent);
598 static inline float rmin() {
599 return std::numeric_limits<float>::min();
601 static inline float emax() {
602 return static_cast<float>(std::numeric_limits<float>::max_exponent);
604 static inline float rmax() {
605 return std::numeric_limits<float>::max();
610 TEUCHOS_SCALAR_TRAITS_NAN_INF_ERR(
611 a,
"Error, the input value to magnitude(...) a = " << a <<
" can not be NaN!" );
615 static inline float zero() {
return(0.0
f); }
616 static inline float one() {
return(1.0
f); }
617 static inline float conjugate(
float x) {
return(x); }
618 static inline float real(
float x) {
return x; }
619 static inline float imag(
float) {
return zero(); }
620 static inline float nan() {
622 return 0.0f/std::sin(0.0
f);
627 static inline bool isnaninf(
float x) {
628 return generic_real_isnaninf<float>(x);
630 static inline void seedrandom(
unsigned int s) {
638 static inline float random() {
float rnd = (float) std::rand() / RAND_MAX;
return (-1.0
f + 2.0
f *
rnd); }
639 static inline std::string
name() {
return "float"; }
643 TEUCHOS_SCALAR_TRAITS_NAN_INF_ERR(
644 x,
"Error, the input value to squareroot(...) x = " << x <<
" can not be NaN!" );
647 const float rtn = std::sqrt(x);
652 static inline float pow(
float x,
float y) {
return std::pow(x,y); }
653 static inline float log(
float x) {
return std::log(x); }
654 static inline float log10(
float x) {
return std::log10(x); }
664 struct ScalarTraits<double>
677 #if defined(HAVE_TEUCHOS_DOUBLE_TO_QD) 679 #elif defined(HAVE_TEUCHOS_DOUBLE_TO_ARPREC) 688 static inline double eps() {
689 return std::numeric_limits<double>::epsilon();
691 static inline double sfmin() {
692 return std::numeric_limits<double>::min();
694 static inline double base() {
695 return std::numeric_limits<double>::radix;
697 static inline double prec() {
700 static inline double t() {
701 return std::numeric_limits<double>::digits;
703 static inline double rnd() {
704 return ( std::numeric_limits<double>::round_style == std::round_to_nearest ?
double(1.0) :
double(0.0) );
706 static inline double emin() {
707 return std::numeric_limits<double>::min_exponent;
709 static inline double rmin() {
710 return std::numeric_limits<double>::min();
712 static inline double emax() {
713 return std::numeric_limits<double>::max_exponent;
715 static inline double rmax() {
716 return std::numeric_limits<double>::max();
721 TEUCHOS_SCALAR_TRAITS_NAN_INF_ERR(
722 a,
"Error, the input value to magnitude(...) a = " << a <<
" can not be NaN!" );
726 static inline double zero() {
return 0.0; }
727 static inline double one() {
return 1.0; }
728 static inline double conjugate(
double x) {
return(x); }
729 static inline double real(
double x) {
return(x); }
730 static inline double imag(
double) {
return(0); }
731 static inline double nan() {
733 return 0.0/std::sin(0.0);
738 static inline bool isnaninf(
double x) {
739 return generic_real_isnaninf<double>(x);
741 static inline void seedrandom(
unsigned int s) {
749 static inline double random() {
double rnd = (double) std::rand() / RAND_MAX;
return (
double)(-1.0 + 2.0 *
rnd); }
750 static inline std::string
name() {
return "double"; }
754 TEUCHOS_SCALAR_TRAITS_NAN_INF_ERR(
755 x,
"Error, the input value to squareroot(...) x = " << x <<
" can not be NaN!" );
758 const double rtn = std::sqrt(x);
763 static inline double pow(
double x,
double y) {
return std::pow(x,y); }
764 static inline double log(
double x) {
return std::log(x); }
765 static inline double log10(
double x) {
return std::log10(x); }
769 #ifdef HAVE_TEUCHOSCORE_QUADMATH 772 struct ScalarTraits<__float128> {
785 static __float128
eps () {
786 return FLT128_EPSILON;
788 static __float128
sfmin () {
791 static __float128
base () {
794 static __float128
prec () {
797 static __float128
t () {
798 return FLT128_MANT_DIG;
800 static __float128
rnd () {
803 static __float128
emin () {
804 return FLT128_MIN_EXP;
806 static __float128
rmin () {
809 static __float128
emax () {
810 return FLT128_MAX_EXP;
812 static __float128
rmax () {
818 static __float128
zero () {
821 static __float128
one () {
824 static __float128
conjugate (
const __float128& x) {
827 static __float128
real (
const __float128& x) {
830 static __float128
imag (
const __float128& ) {
833 static __float128
nan () {
834 return strtoflt128 (
"NAN()", NULL);
836 static bool isnaninf (
const __float128& x) {
837 return isinfq (x) || isnanq (x);
839 static inline void seedrandom (
unsigned int s) {
847 static __float128
random () {
850 const __float128 scalingFactor =
851 static_cast<__float128
> (std::numeric_limits<double>::min ()) /
852 static_cast<__float128> (2.0);
853 const __float128 higherOrderTerm =
855 const __float128 lowerOrderTerm =
858 return higherOrderTerm + lowerOrderTerm;
860 static std::string
name () {
863 static __float128
squareroot (
const __float128& x) {
866 static __float128
pow (
const __float128& x,
const __float128& y) {
869 static __float128 log (
const __float128& x) {
872 static __float128 log10 (
const __float128& x) {
876 #endif // HAVE_TEUCHOSCORE_QUADMATH 880 #ifdef HAVE_TEUCHOS_QD 882 bool operator&&(
const dd_real &a,
const dd_real &b);
883 bool operator&&(
const qd_real &a,
const qd_real &b);
886 struct ScalarTraits<dd_real>
895 static inline dd_real
eps() {
return std::numeric_limits<dd_real>::epsilon(); }
896 static inline dd_real
sfmin() {
return std::numeric_limits<dd_real>::min(); }
897 static inline dd_real
base() {
return std::numeric_limits<dd_real>::radix; }
898 static inline dd_real
prec() {
return eps()*
base(); }
899 static inline dd_real
t() {
return std::numeric_limits<dd_real>::digits; }
900 static inline dd_real
rnd() {
return ( std::numeric_limits<dd_real>::round_style == std::round_to_nearest ? dd_real(1.0) : dd_real(0.0) ); }
901 static inline dd_real
emin() {
return std::numeric_limits<dd_real>::min_exponent; }
902 static inline dd_real
rmin() {
return std::numeric_limits<dd_real>::min(); }
903 static inline dd_real
emax() {
return std::numeric_limits<dd_real>::max_exponent; }
904 static inline dd_real
rmax() {
return std::numeric_limits<dd_real>::max(); }
908 TEUCHOS_SCALAR_TRAITS_NAN_INF_ERR(
909 a,
"Error, the input value to magnitude(...) a = " << a <<
" can not be NaN!" );
913 static inline dd_real
zero() {
return dd_real(0.0); }
914 static inline dd_real
one() {
return dd_real(1.0); }
915 static inline dd_real
conjugate(dd_real x) {
return(x); }
916 static inline dd_real
real(dd_real x) {
return x ; }
917 static inline dd_real
imag(dd_real) {
return zero(); }
918 static inline dd_real
nan() {
return dd_real::_nan; }
919 static inline bool isnaninf(dd_real x) {
return isnan(x) || isinf(x); }
920 static inline void seedrandom(
unsigned int s) {
929 static inline dd_real
random() {
return ddrand(); }
930 static inline std::string
name() {
return "dd_real"; }
934 TEUCHOS_SCALAR_TRAITS_NAN_INF_ERR(
935 x,
"Error, the input value to squareroot(...) x = " << x <<
" can not be NaN!" );
939 static inline dd_real
pow(dd_real x, dd_real y) { return ::pow(x,y); }
941 static inline dd_real log(dd_real x) { return ::log(x); }
942 static inline dd_real log10(dd_real x) { return ::log10(x); }
947 struct ScalarTraits<qd_real>
956 static inline qd_real
eps() {
return std::numeric_limits<qd_real>::epsilon(); }
957 static inline qd_real
sfmin() {
return std::numeric_limits<qd_real>::min(); }
958 static inline qd_real
base() {
return std::numeric_limits<qd_real>::radix; }
959 static inline qd_real
prec() {
return eps()*
base(); }
960 static inline qd_real
t() {
return std::numeric_limits<qd_real>::digits; }
961 static inline qd_real
rnd() {
return ( std::numeric_limits<qd_real>::round_style == std::round_to_nearest ? qd_real(1.0) : qd_real(0.0) ); }
962 static inline qd_real
emin() {
return std::numeric_limits<qd_real>::min_exponent; }
963 static inline qd_real
rmin() {
return std::numeric_limits<qd_real>::min(); }
964 static inline qd_real
emax() {
return std::numeric_limits<qd_real>::max_exponent; }
965 static inline qd_real
rmax() {
return std::numeric_limits<qd_real>::max(); }
969 TEUCHOS_SCALAR_TRAITS_NAN_INF_ERR(
970 a,
"Error, the input value to magnitude(...) a = " << a <<
" can not be NaN!" );
974 static inline qd_real
zero() {
return qd_real(0.0); }
975 static inline qd_real
one() {
return qd_real(1.0); }
976 static inline qd_real
conjugate(qd_real x) {
return(x); }
977 static inline qd_real
real(qd_real x) {
return x ; }
978 static inline qd_real
imag(qd_real) {
return zero(); }
979 static inline qd_real
nan() {
return qd_real::_nan; }
980 static inline bool isnaninf(qd_real x) {
return isnan(x) || isinf(x); }
981 static inline void seedrandom(
unsigned int s) {
990 static inline qd_real
random() {
return qdrand(); }
991 static inline std::string
name() {
return "qd_real"; }
995 TEUCHOS_SCALAR_TRAITS_NAN_INF_ERR(
996 x,
"Error, the input value to squareroot(...) x = " << x <<
" can not be NaN!" );
1000 static inline qd_real
pow(qd_real x, qd_real y) { return ::pow(x,y); }
1002 static inline qd_real log(qd_real x) { return ::log(x); }
1003 static inline qd_real log10(qd_real x) { return ::log10(x); }
1007 #endif // HAVE_TEUCHOS_QD 1010 #ifdef HAVE_TEUCHOS_GNU_MP 1013 extern gmp_randclass gmp_rng;
1033 struct ScalarTraits<mpf_class>
1042 static inline mpf_class
zero() { mpf_class
zero = 0.0;
return zero; }
1043 static inline mpf_class
one() { mpf_class
one = 1.0;
return one; }
1044 static inline mpf_class
conjugate(mpf_class x) {
return x; }
1045 static inline mpf_class
real(mpf_class x) {
return(x); }
1046 static inline mpf_class
imag(mpf_class x) {
return(0); }
1047 static inline bool isnaninf(mpf_class x) {
return false; }
1048 static inline void seedrandom(
unsigned int s) {
1049 unsigned long int seedVal =
static_cast<unsigned long int>(s);
1050 gmp_rng.seed( seedVal );
1052 static inline mpf_class
random() {
1053 return gmp_rng.get_f();
1055 static inline std::string
name() {
return "mpf_class"; }
1056 static inline mpf_class
squareroot(mpf_class x) {
return std::sqrt(x); }
1057 static inline mpf_class
pow(mpf_class x, mpf_class y) {
return pow(x,y); }
1061 #endif // HAVE_TEUCHOS_GNU_MP 1063 #ifdef HAVE_TEUCHOS_ARPREC 1068 struct ScalarTraits<mp_real>
1079 static inline mp_real
zero() { mp_real
zero = 0.0;
return zero; }
1080 static inline mp_real
one() { mp_real
one = 1.0;
return one; }
1081 static inline mp_real
conjugate(mp_real x) {
return x; }
1082 static inline mp_real
real(mp_real x) {
return(x); }
1083 static inline mp_real
imag(mp_real x) {
return zero(); }
1084 static inline bool isnaninf(mp_real x) {
return false; }
1085 static inline void seedrandom(
unsigned int s) {
1086 long int seedVal =
static_cast<long int>(s);
1089 static inline mp_real
random() {
return mp_rand(); }
1090 static inline std::string
name() {
return "mp_real"; }
1091 static inline mp_real
squareroot(mp_real x) {
return sqrt(x); }
1092 static inline mp_real
pow(mp_real x, mp_real y) {
return pow(x,y); }
1097 #endif // HAVE_TEUCHOS_ARPREC 1100 #ifdef HAVE_TEUCHOS_COMPLEX 1105 struct ScalarTraits<
1109 typedef std::complex<T> ComplexT;
1110 typedef std::complex<typename ScalarTraits<T>::halfPrecision>
halfPrecision;
1111 typedef std::complex<typename ScalarTraits<T>::doublePrecision>
doublePrecision;
1129 #ifdef TEUCHOS_DEBUG 1130 TEUCHOS_SCALAR_TRAITS_NAN_INF_ERR(
1131 a,
"Error, the input value to magnitude(...) a = " << a <<
" can not be NaN!" );
1137 static inline ComplexT
conjugate(ComplexT a){
return ComplexT(a.real(),-a.imag()); }
1143 static inline ComplexT
random()
1147 return ComplexT(rnd1,rnd2);
1151 static inline ComplexT
squareroot(ComplexT x)
1153 #ifdef TEUCHOS_DEBUG 1154 TEUCHOS_SCALAR_TRAITS_NAN_INF_ERR(
1155 x,
"Error, the input value to squareroot(...) x = " << x <<
" can not be NaN!" );
1157 typedef ScalarTraits<magnitudeType> STMT;
1158 const T r = x.real(), i = x.imag(),
zero = STMT::zero(), two = 2.0;
1159 const T a = STMT::squareroot((r*r)+(i*i));
1160 const T nr = STMT::squareroot((a+r)/two);
1161 const T ni = ( i ==
zero ?
zero : STMT::squareroot((a-r)/two) );
1162 return ComplexT(nr,ni);
1176 static inline ComplexT
pow(ComplexT x, ComplexT y) {
return pow(x,y); }
1179 #endif // HAVE_TEUCHOS_COMPLEX 1180 #endif // DOXYGEN_SHOULD_SKIP_THIS 1184 #endif // _TEUCHOS_SCALARTRAITS_HPP_ T magnitudeType
Mandatory typedef for result of magnitude.
static magnitudeType eps()
Returns relative machine precision.
static T squareroot(T x)
Returns a number of magnitudeType that is the square root of this scalar type x.
static const bool isComparable
Determines if scalar type supports relational operators such as <, >, <=, >=.
static magnitudeType real(T a)
Returns the real part of the scalar type a.
Teuchos header file which uses auto-configuration information to include necessary C++ headers...
Declaration and default implementation for basic traits for the scalar field type.
static T pow(T x, T y)
Returns the result of raising one scalar x to the power y.
static magnitudeType emax()
Returns the largest exponent before overflow.
static magnitudeType base()
Returns the base of the machine.
static const bool hasMachineParameters
Determines if scalar type have machine-specific parameters (i.e. eps(), sfmin(), base(), prec(), t(), rnd(), emin(), rmin(), emax(), rmax() are supported).
ostream & operator<<(ostream &os, const pair< Packet, Packet > &arg)
static std::string name()
Returns the name of this scalar type.
static magnitudeType rmax()
Overflow theshold - (base^emax)*(1-eps)
static magnitudeType sfmin()
Returns safe minimum (sfmin), such that 1/sfmin does not overflow.
static T conjugate(T a)
Returns the conjugate of the scalar type a.
static const bool isOrdinal
Determines if scalar type is an ordinal type.
static magnitudeType prec()
Returns eps*base.
#define TEUCHOSCORE_LIB_DLL_EXPORT
static magnitudeType t()
Returns the number of (base) digits in the mantissa.
static magnitudeType rmin()
Returns the underflow threshold - base^(emin-1)
T doublePrecision
Typedef for double precision.
static void seedrandom(unsigned int s)
Seed the random number generator returned by random().
static magnitudeType imag(T a)
Returns the imaginary part of the scalar type a.
static bool isnaninf(const T &x)
Returns true if x is NaN or Inf.
static magnitudeType magnitude(T a)
Returns the magnitudeType of the scalar type a.
static T nan()
Returns a number that represents NaN.
std::istream & operator>>(std::istream &in, CustomDataType &object)
static T zero()
Returns representation of zero for this scalar type.
static T random()
Returns a random number (between -one() and +one()) of this scalar type.
T halfPrecision
Typedef for half precision.
static const bool isComplex
Determines if scalar type is std::complex.
static magnitudeType emin()
Returns the minimum exponent before (gradual) underflow.
static magnitudeType rnd()
Returns 1.0 when rounding occurs in addition, 0.0 otherwise.
static T one()
Returns representation of one for this scalar type.