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))); }
409 struct ScalarTraits<long long int>
419 static inline magnitudeType magnitude(
long long int a) {
return static_cast<long long int>(std::fabs(static_cast<double>(a))); }
420 static inline long long int zero() {
return 0; }
421 static inline long long int one() {
return 1; }
422 static inline long long int conjugate(
long long int x) {
return x; }
423 static inline long long int real(
long long int x) {
return x; }
424 static inline long long int imag(
long long int) {
return 0; }
425 static inline bool isnaninf(
long long int) {
return false; }
426 static inline void seedrandom(
unsigned int s) {
435 static inline long long int random() {
return std::rand(); }
436 static inline std::string
name() {
return "long long int"; }
437 static inline long long int squareroot(
long long int x) {
return (
long long int) std::sqrt((
double) x); }
438 static inline long long int pow(
long long int x,
long long int y) {
return (
long long int) std::pow((
double)x,(
double)y); }
441 static inline long long int log(
long long int x) {
return static_cast<long long int> (std::log (static_cast<double> (x))); }
442 static inline long long int log10(
long long int x) {
return static_cast<long long int> (std::log10 (static_cast<double> (x))); }
446 struct ScalarTraits<unsigned long long int>
456 static inline magnitudeType magnitude(
unsigned long long int a) {
return static_cast<unsigned long long int>(std::fabs(static_cast<double>(a))); }
457 static inline unsigned long long int zero() {
return 0; }
458 static inline unsigned long long int one() {
return 1; }
459 static inline unsigned long long int conjugate(
unsigned long long int x) {
return x; }
460 static inline unsigned long long int real(
unsigned long long int x) {
return x; }
461 static inline unsigned long long int imag(
unsigned long long int) {
return 0; }
462 static inline bool isnaninf(
unsigned long long int) {
return false; }
463 static inline void seedrandom(
unsigned int s) {
472 static inline unsigned long long int random() {
return std::rand(); }
473 static inline std::string
name() {
return "unsigned long long int"; }
474 static inline unsigned long long int squareroot(
unsigned long long int x) {
return (
unsigned long long int) std::sqrt((
double) x); }
475 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); }
478 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))); }
479 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))); }
483 #ifdef HAVE_TEUCHOS___INT64 486 struct ScalarTraits<__int64>
496 static inline magnitudeType magnitude(__int64 a) {
return static_cast<__int64
>(std::fabs(static_cast<double>(a))); }
497 static inline __int64
zero() {
return 0; }
498 static inline __int64
one() {
return 1; }
499 static inline __int64
conjugate(__int64 x) {
return x; }
500 static inline __int64
real(__int64 x) {
return x; }
501 static inline __int64
imag(__int64) {
return 0; }
502 static inline void seedrandom(
unsigned int s) {
511 static inline __int64
random() {
return std::rand(); }
512 static inline std::string
name() {
return "__int64"; }
513 static inline __int64
squareroot(__int64 x) {
return (__int64) std::sqrt((
double) x); }
514 static inline __int64
pow(__int64 x, __int64 y) {
return (__int64) std::pow((
double)x,(
double)y); }
517 static inline __int64 log(__int64 x) {
return static_cast<__int64
> (std::log (static_cast<double> (x))); }
518 static inline __int64 log10(__int64 x) {
return static_cast<__int64
> (std::log10 (static_cast<double> (x))); }
522 struct ScalarTraits<unsigned __int64>
532 static inline magnitudeType magnitude(
unsigned __int64 a) {
return static_cast<unsigned __int64
>(std::fabs(static_cast<double>(a))); }
533 static inline unsigned __int64
zero() {
return 0; }
534 static inline unsigned __int64
one() {
return 1; }
535 static inline unsigned __int64
conjugate(
unsigned __int64 x) {
return x; }
536 static inline unsigned __int64
real(
unsigned __int64 x) {
return x; }
537 static inline unsigned __int64
imag(
unsigned __int64) {
return 0; }
538 static inline void seedrandom(
unsigned int s) {
547 static inline unsigned __int64
random() {
return std::rand(); }
548 static inline std::string
name() {
return "unsigned __int64"; }
549 static inline unsigned __int64
squareroot(
unsigned __int64 x) {
return (
unsigned __int64) std::sqrt((
double) x); }
550 static inline unsigned __int64
pow(
unsigned __int64 x,
unsigned __int64 y) {
return (
unsigned __int64) std::pow((
double)x,(
double)y); }
553 static inline unsigned __int64 log(
unsigned __int64 x) {
return static_cast<unsigned __int64
> (std::log (static_cast<double> (x))); }
554 static inline unsigned __int64 log10(
unsigned __int64 x) {
return static_cast<unsigned __int64
> (std::log10 (static_cast<double> (x))); }
557 #endif // HAVE_TEUCHOS___INT64 566 struct ScalarTraits<float>
575 static inline float eps() {
576 return std::numeric_limits<float>::epsilon();
578 static inline float sfmin() {
579 return std::numeric_limits<float>::min();
581 static inline float base() {
582 return static_cast<float>(std::numeric_limits<float>::radix);
584 static inline float prec() {
587 static inline float t() {
588 return static_cast<float>(std::numeric_limits<float>::digits);
590 static inline float rnd() {
591 return ( std::numeric_limits<float>::round_style == std::round_to_nearest ?
one() :
zero() );
593 static inline float emin() {
594 return static_cast<float>(std::numeric_limits<float>::min_exponent);
596 static inline float rmin() {
597 return std::numeric_limits<float>::min();
599 static inline float emax() {
600 return static_cast<float>(std::numeric_limits<float>::max_exponent);
602 static inline float rmax() {
603 return std::numeric_limits<float>::max();
608 TEUCHOS_SCALAR_TRAITS_NAN_INF_ERR(
609 a,
"Error, the input value to magnitude(...) a = " << a <<
" can not be NaN!" );
613 static inline float zero() {
return(0.0
f); }
614 static inline float one() {
return(1.0
f); }
615 static inline float conjugate(
float x) {
return(x); }
616 static inline float real(
float x) {
return x; }
617 static inline float imag(
float) {
return zero(); }
618 static inline float nan() {
620 return 0.0f/std::sin(0.0
f);
625 static inline bool isnaninf(
float x) {
626 return generic_real_isnaninf<float>(x);
628 static inline void seedrandom(
unsigned int s) {
636 static inline float random() {
float rnd = (float) std::rand() / RAND_MAX;
return (-1.0
f + 2.0
f *
rnd); }
637 static inline std::string
name() {
return "float"; }
641 TEUCHOS_SCALAR_TRAITS_NAN_INF_ERR(
642 x,
"Error, the input value to squareroot(...) x = " << x <<
" can not be NaN!" );
645 const float rtn = std::sqrt(x);
650 static inline float pow(
float x,
float y) {
return std::pow(x,y); }
651 static inline float pi() {
return 3.14159265358979323846f; }
652 static inline float log(
float x) {
return std::log(x); }
653 static inline float log10(
float x) {
return std::log10(x); }
663 struct ScalarTraits<double>
676 #if defined(HAVE_TEUCHOS_DOUBLE_TO_QD) 678 #elif defined(HAVE_TEUCHOS_DOUBLE_TO_ARPREC) 687 static inline double eps() {
688 return std::numeric_limits<double>::epsilon();
690 static inline double sfmin() {
691 return std::numeric_limits<double>::min();
693 static inline double base() {
694 return std::numeric_limits<double>::radix;
696 static inline double prec() {
699 static inline double t() {
700 return std::numeric_limits<double>::digits;
702 static inline double rnd() {
703 return ( std::numeric_limits<double>::round_style == std::round_to_nearest ?
double(1.0) :
double(0.0) );
705 static inline double emin() {
706 return std::numeric_limits<double>::min_exponent;
708 static inline double rmin() {
709 return std::numeric_limits<double>::min();
711 static inline double emax() {
712 return std::numeric_limits<double>::max_exponent;
714 static inline double rmax() {
715 return std::numeric_limits<double>::max();
720 TEUCHOS_SCALAR_TRAITS_NAN_INF_ERR(
721 a,
"Error, the input value to magnitude(...) a = " << a <<
" can not be NaN!" );
725 static inline double zero() {
return 0.0; }
726 static inline double one() {
return 1.0; }
727 static inline double conjugate(
double x) {
return(x); }
728 static inline double real(
double x) {
return(x); }
729 static inline double imag(
double) {
return(0); }
730 static inline double nan() {
732 return 0.0/std::sin(0.0);
737 static inline bool isnaninf(
double x) {
738 return generic_real_isnaninf<double>(x);
740 static inline void seedrandom(
unsigned int s) {
748 static inline double random() {
double rnd = (double) std::rand() / RAND_MAX;
return (
double)(-1.0 + 2.0 *
rnd); }
749 static inline std::string
name() {
return "double"; }
753 TEUCHOS_SCALAR_TRAITS_NAN_INF_ERR(
754 x,
"Error, the input value to squareroot(...) x = " << x <<
" can not be NaN!" );
757 const double rtn = std::sqrt(x);
762 static inline double pow(
double x,
double y) {
return std::pow(x,y); }
763 static inline double pi() {
return 3.14159265358979323846; }
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
pi() {
return 3.14159265358979323846; }
870 static __float128 log (
const __float128& x) {
873 static __float128 log10 (
const __float128& x) {
877 #endif // HAVE_TEUCHOSCORE_QUADMATH 881 #ifdef HAVE_TEUCHOS_QD 883 bool operator&&(
const dd_real &a,
const dd_real &b);
884 bool operator&&(
const qd_real &a,
const qd_real &b);
887 struct ScalarTraits<dd_real>
896 static inline dd_real
eps() {
return std::numeric_limits<dd_real>::epsilon(); }
897 static inline dd_real
sfmin() {
return std::numeric_limits<dd_real>::min(); }
898 static inline dd_real
base() {
return std::numeric_limits<dd_real>::radix; }
899 static inline dd_real
prec() {
return eps()*
base(); }
900 static inline dd_real
t() {
return std::numeric_limits<dd_real>::digits; }
901 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) ); }
902 static inline dd_real
emin() {
return std::numeric_limits<dd_real>::min_exponent; }
903 static inline dd_real
rmin() {
return std::numeric_limits<dd_real>::min(); }
904 static inline dd_real
emax() {
return std::numeric_limits<dd_real>::max_exponent; }
905 static inline dd_real
rmax() {
return std::numeric_limits<dd_real>::max(); }
909 TEUCHOS_SCALAR_TRAITS_NAN_INF_ERR(
910 a,
"Error, the input value to magnitude(...) a = " << a <<
" can not be NaN!" );
914 static inline dd_real
zero() {
return dd_real(0.0); }
915 static inline dd_real
one() {
return dd_real(1.0); }
916 static inline dd_real
conjugate(dd_real x) {
return(x); }
917 static inline dd_real
real(dd_real x) {
return x ; }
918 static inline dd_real
imag(dd_real) {
return zero(); }
919 static inline dd_real
nan() {
return dd_real::_nan; }
920 static inline bool isnaninf(dd_real x) {
return isnan(x) || isinf(x); }
921 static inline void seedrandom(
unsigned int s) {
930 static inline dd_real
random() {
return ddrand(); }
931 static inline std::string
name() {
return "dd_real"; }
935 TEUCHOS_SCALAR_TRAITS_NAN_INF_ERR(
936 x,
"Error, the input value to squareroot(...) x = " << x <<
" can not be NaN!" );
940 static inline dd_real
pow(dd_real x, dd_real y) { return ::pow(x,y); }
941 static inline dd_real
pi() {
return 3.14159265358979323846; }
943 static inline dd_real log(dd_real x) { return ::log(x); }
944 static inline dd_real log10(dd_real x) { return ::log10(x); }
949 struct ScalarTraits<qd_real>
958 static inline qd_real
eps() {
return std::numeric_limits<qd_real>::epsilon(); }
959 static inline qd_real
sfmin() {
return std::numeric_limits<qd_real>::min(); }
960 static inline qd_real
base() {
return std::numeric_limits<qd_real>::radix; }
961 static inline qd_real
prec() {
return eps()*
base(); }
962 static inline qd_real
t() {
return std::numeric_limits<qd_real>::digits; }
963 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) ); }
964 static inline qd_real
emin() {
return std::numeric_limits<qd_real>::min_exponent; }
965 static inline qd_real
rmin() {
return std::numeric_limits<qd_real>::min(); }
966 static inline qd_real
emax() {
return std::numeric_limits<qd_real>::max_exponent; }
967 static inline qd_real
rmax() {
return std::numeric_limits<qd_real>::max(); }
971 TEUCHOS_SCALAR_TRAITS_NAN_INF_ERR(
972 a,
"Error, the input value to magnitude(...) a = " << a <<
" can not be NaN!" );
976 static inline qd_real
zero() {
return qd_real(0.0); }
977 static inline qd_real
one() {
return qd_real(1.0); }
978 static inline qd_real
conjugate(qd_real x) {
return(x); }
979 static inline qd_real
real(qd_real x) {
return x ; }
980 static inline qd_real
imag(qd_real) {
return zero(); }
981 static inline qd_real
nan() {
return qd_real::_nan; }
982 static inline bool isnaninf(qd_real x) {
return isnan(x) || isinf(x); }
983 static inline void seedrandom(
unsigned int s) {
992 static inline qd_real
random() {
return qdrand(); }
993 static inline std::string
name() {
return "qd_real"; }
997 TEUCHOS_SCALAR_TRAITS_NAN_INF_ERR(
998 x,
"Error, the input value to squareroot(...) x = " << x <<
" can not be NaN!" );
1002 static inline qd_real
pow(qd_real x, qd_real y) { return ::pow(x,y); }
1003 static inline qd_real
pi() {
return 3.14159265358979323846; }
1005 static inline qd_real log(qd_real x) { return ::log(x); }
1006 static inline qd_real log10(qd_real x) { return ::log10(x); }
1010 #endif // HAVE_TEUCHOS_QD 1013 #ifdef HAVE_TEUCHOS_GNU_MP 1016 extern gmp_randclass gmp_rng;
1036 struct ScalarTraits<mpf_class>
1045 static inline mpf_class
zero() { mpf_class
zero = 0.0;
return zero; }
1046 static inline mpf_class
one() { mpf_class
one = 1.0;
return one; }
1047 static inline mpf_class
conjugate(mpf_class x) {
return x; }
1048 static inline mpf_class
real(mpf_class x) {
return(x); }
1049 static inline mpf_class
imag(mpf_class x) {
return(0); }
1050 static inline bool isnaninf(mpf_class x) {
return false; }
1051 static inline void seedrandom(
unsigned int s) {
1052 unsigned long int seedVal =
static_cast<unsigned long int>(s);
1053 gmp_rng.seed( seedVal );
1055 static inline mpf_class
random() {
1056 return gmp_rng.get_f();
1058 static inline std::string
name() {
return "mpf_class"; }
1059 static inline mpf_class
squareroot(mpf_class x) {
return std::sqrt(x); }
1060 static inline mpf_class
pow(mpf_class x, mpf_class y) {
return pow(x,y); }
1064 #endif // HAVE_TEUCHOS_GNU_MP 1066 #ifdef HAVE_TEUCHOS_ARPREC 1071 struct ScalarTraits<mp_real>
1082 static inline mp_real
zero() { mp_real
zero = 0.0;
return zero; }
1083 static inline mp_real
one() { mp_real
one = 1.0;
return one; }
1084 static inline mp_real
conjugate(mp_real x) {
return x; }
1085 static inline mp_real
real(mp_real x) {
return(x); }
1086 static inline mp_real
imag(mp_real x) {
return zero(); }
1087 static inline bool isnaninf(mp_real x) {
return false; }
1088 static inline void seedrandom(
unsigned int s) {
1089 long int seedVal =
static_cast<long int>(s);
1092 static inline mp_real
random() {
return mp_rand(); }
1093 static inline std::string
name() {
return "mp_real"; }
1094 static inline mp_real
squareroot(mp_real x) {
return sqrt(x); }
1095 static inline mp_real
pow(mp_real x, mp_real y) {
return pow(x,y); }
1096 static inline mp_real
pi() {
return 3.14159265358979323846; }
1101 #endif // HAVE_TEUCHOS_ARPREC 1104 #ifdef HAVE_TEUCHOS_COMPLEX 1109 struct ScalarTraits<
1113 typedef std::complex<T> ComplexT;
1114 typedef std::complex<typename ScalarTraits<T>::halfPrecision>
halfPrecision;
1115 typedef std::complex<typename ScalarTraits<T>::doublePrecision>
doublePrecision;
1133 #ifdef TEUCHOS_DEBUG 1134 TEUCHOS_SCALAR_TRAITS_NAN_INF_ERR(
1135 a,
"Error, the input value to magnitude(...) a = " << a <<
" can not be NaN!" );
1141 static inline ComplexT
conjugate(ComplexT a){
return ComplexT(a.real(),-a.imag()); }
1147 static inline ComplexT
random()
1151 return ComplexT(rnd1,rnd2);
1155 static inline ComplexT
squareroot(ComplexT x)
1157 #ifdef TEUCHOS_DEBUG 1158 TEUCHOS_SCALAR_TRAITS_NAN_INF_ERR(
1159 x,
"Error, the input value to squareroot(...) x = " << x <<
" can not be NaN!" );
1161 typedef ScalarTraits<magnitudeType> STMT;
1162 const T r = x.real(), i = x.imag(),
zero = STMT::zero(), two = 2.0;
1163 const T a = STMT::squareroot((r*r)+(i*i));
1164 const T nr = STMT::squareroot((a+r)/two);
1165 const T ni = ( i ==
zero ?
zero : STMT::squareroot((a-r)/two) );
1166 return ComplexT(nr,ni);
1180 static inline ComplexT
pow(ComplexT x, ComplexT y) {
return pow(x,y); }
1184 #endif // HAVE_TEUCHOS_COMPLEX 1185 #endif // DOXYGEN_SHOULD_SKIP_THIS 1189 #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 pi()
Returns the value of PI.
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.