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);
92 operator>> (std::istream& in, __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
118 TEUCHOSCORE_LIB_DLL_EXPORT
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
561 extern TEUCHOSCORE_LIB_DLL_EXPORT
const float flt_nan;
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.0f); }
614 static inline float one() {
return(1.0f); }
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.0f);
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.0f + 2.0f *
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); }
658 extern TEUCHOSCORE_LIB_DLL_EXPORT
const double dbl_nan;
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_