diff options
author | Erik Schnetter <schnetter@cct.lsu.edu> | 2010-03-18 15:28:39 -0700 |
---|---|---|
committer | Barry Wardell <barry.wardell@gmail.com> | 2011-12-14 16:45:35 +0000 |
commit | b1ca9bb147872979ec3b14a9f5a4b9f23986be4d (patch) | |
tree | 23713491fecd4f5fab37a70b025cbc73ea6a6c41 /Carpet/CarpetLib/src/defs.hh | |
parent | 264f5a5989293d3b9686516c23596bde64a117f8 (diff) |
CarpetLib: Provide good implementations of isnan and friends
Find the system's implementations of isnan etc., and provide them in
the CarpetLib::good namespace.
Diffstat (limited to 'Carpet/CarpetLib/src/defs.hh')
-rw-r--r-- | Carpet/CarpetLib/src/defs.hh | 247 |
1 files changed, 246 insertions, 1 deletions
diff --git a/Carpet/CarpetLib/src/defs.hh b/Carpet/CarpetLib/src/defs.hh index 577f35e6d..d4ff68505 100644 --- a/Carpet/CarpetLib/src/defs.hh +++ b/Carpet/CarpetLib/src/defs.hh @@ -209,7 +209,62 @@ inline const char * typestring (const CCTK_COMPLEX32&) -// Capture the system's isnan function +// Capture the system's fpclassify, isfinite, isinf, isnan, and +// isnormal functions + +#ifdef HAVE_CCTK_REAL4 +inline int myfpclassify (CCTK_REAL4 const & x) CCTK_ATTRIBUTE_CONST; +int myfpclassify (CCTK_REAL4 const & x) +{ return fpclassify (x); } +#endif +#ifdef HAVE_CCTK_REAL8 +inline int myfpclassify (CCTK_REAL8 const & x) CCTK_ATTRIBUTE_CONST; +inline int myfpclassify (CCTK_REAL8 const & x) +{ return fpclassify (x); } +#endif +#ifdef HAVE_CCTK_REAL16 +inline int myfpclassify (CCTK_REAL16 const & x) CCTK_ATTRIBUTE_CONST; +inline int myfpclassify (CCTK_REAL16 const & x) +{ return fpclassify (x); } +#endif + +#undef fpclassify + +#ifdef HAVE_CCTK_REAL4 +inline int myisfinite (CCTK_REAL4 const & x) CCTK_ATTRIBUTE_CONST; +int myisfinite (CCTK_REAL4 const & x) +{ return isfinite (x); } +#endif +#ifdef HAVE_CCTK_REAL8 +inline int myisfinite (CCTK_REAL8 const & x) CCTK_ATTRIBUTE_CONST; +inline int myisfinite (CCTK_REAL8 const & x) +{ return isfinite (x); } +#endif +#ifdef HAVE_CCTK_REAL16 +inline int myisfinite (CCTK_REAL16 const & x) CCTK_ATTRIBUTE_CONST; +inline int myisfinite (CCTK_REAL16 const & x) +{ return isfinite (x); } +#endif + +#undef isfinite + +#ifdef HAVE_CCTK_REAL4 +inline int myisinf (CCTK_REAL4 const & x) CCTK_ATTRIBUTE_CONST; +int myisinf (CCTK_REAL4 const & x) +{ return isinf (x); } +#endif +#ifdef HAVE_CCTK_REAL8 +inline int myisinf (CCTK_REAL8 const & x) CCTK_ATTRIBUTE_CONST; +inline int myisinf (CCTK_REAL8 const & x) +{ return isinf (x); } +#endif +#ifdef HAVE_CCTK_REAL16 +inline int myisinf (CCTK_REAL16 const & x) CCTK_ATTRIBUTE_CONST; +inline int myisinf (CCTK_REAL16 const & x) +{ return isinf (x); } +#endif + +#undef isinf #ifdef HAVE_CCTK_REAL4 inline int myisnan (CCTK_REAL4 const & x) CCTK_ATTRIBUTE_CONST; @@ -229,6 +284,24 @@ inline int myisnan (CCTK_REAL16 const & x) #undef isnan +#ifdef HAVE_CCTK_REAL4 +inline int myisnormal (CCTK_REAL4 const & x) CCTK_ATTRIBUTE_CONST; +int myisnormal (CCTK_REAL4 const & x) +{ return isnormal (x); } +#endif +#ifdef HAVE_CCTK_REAL8 +inline int myisnormal (CCTK_REAL8 const & x) CCTK_ATTRIBUTE_CONST; +inline int myisnormal (CCTK_REAL8 const & x) +{ return isnormal (x); } +#endif +#ifdef HAVE_CCTK_REAL16 +inline int myisnormal (CCTK_REAL16 const & x) CCTK_ATTRIBUTE_CONST; +inline int myisnormal (CCTK_REAL16 const & x) +{ return isnormal (x); } +#endif + +#undef isnormal + namespace CarpetLib { @@ -291,6 +364,135 @@ namespace CarpetLib { #endif // + // fpclassify + // + + // Default implementation, only good for integers + template <typename T> + inline int fpclassify (T const & x) CCTK_ATTRIBUTE_CONST; + template <typename T> + inline int fpclassify (T const & x) + { return x ? FP_NORMAL : FP_ZERO; } + +#ifdef HAVE_CCTK_REAL4 + template<> inline int fpclassify (CCTK_REAL4 const & x) CCTK_ATTRIBUTE_CONST; + template<> inline int fpclassify (CCTK_REAL4 const & x) + { return myfpclassify (x); } +#endif +#ifdef HAVE_CCTK_REAL8 + template<> inline int fpclassify (CCTK_REAL8 const & x) CCTK_ATTRIBUTE_CONST; + template<> inline int fpclassify (CCTK_REAL8 const & x) + { return myfpclassify (x); } +#endif +#ifdef HAVE_CCTK_REAL16 + template<> inline int fpclassify (CCTK_REAL16 const & x) CCTK_ATTRIBUTE_CONST; + template<> inline int fpclassify (CCTK_REAL16 const & x) + { return myfpclassify (x); } +#endif + +#ifdef HAVE_CCTK_COMPLEX8 + template<> inline int fpclassify (CCTK_COMPLEX8 const & x) CCTK_ATTRIBUTE_CONST; + template<> inline int fpclassify (CCTK_COMPLEX8 const & x) + { assert(0); } +#endif +#ifdef HAVE_CCTK_COMPLEX16 + template<> inline int fpclassify (CCTK_COMPLEX16 const & x) CCTK_ATTRIBUTE_CONST; + template<> inline int fpclassify (CCTK_COMPLEX16 const & x) + { assert(0); } +#endif +#ifdef HAVE_CCTK_COMPLEX32 + template<> inline int fpclassify (CCTK_COMPLEX32 const & x) CCTK_ATTRIBUTE_CONST; + template<> inline int fpclassify (CCTK_COMPLEX32 const & x) + { assert(0); } +#endif + + // + // isfinite + // + + // Default implementation, only good for integers + template <typename T> + inline int isfinite (T const & x) CCTK_ATTRIBUTE_CONST; + template <typename T> + inline int isfinite (T const & x) + { return 1; } + +#ifdef HAVE_CCTK_REAL4 + template<> inline int isfinite (CCTK_REAL4 const & x) CCTK_ATTRIBUTE_CONST; + template<> inline int isfinite (CCTK_REAL4 const & x) + { return myisfinite (x); } +#endif +#ifdef HAVE_CCTK_REAL8 + template<> inline int isfinite (CCTK_REAL8 const & x) CCTK_ATTRIBUTE_CONST; + template<> inline int isfinite (CCTK_REAL8 const & x) + { return myisfinite (x); } +#endif +#ifdef HAVE_CCTK_REAL16 + template<> inline int isfinite (CCTK_REAL16 const & x) CCTK_ATTRIBUTE_CONST; + template<> inline int isfinite (CCTK_REAL16 const & x) + { return myisfinite (x); } +#endif + +#ifdef HAVE_CCTK_COMPLEX8 + template<> inline int isfinite (CCTK_COMPLEX8 const & x) CCTK_ATTRIBUTE_CONST; + template<> inline int isfinite (CCTK_COMPLEX8 const & x) + { return myisfinite (CCTK_Cmplx8Real (x)) and myisfinite (CCTK_Cmplx8Imag (x)); } +#endif +#ifdef HAVE_CCTK_COMPLEX16 + template<> inline int isfinite (CCTK_COMPLEX16 const & x) CCTK_ATTRIBUTE_CONST; + template<> inline int isfinite (CCTK_COMPLEX16 const & x) + { return myisfinite (CCTK_Cmplx16Real (x)) and myisfinite (CCTK_Cmplx16Imag (x)); } +#endif +#ifdef HAVE_CCTK_COMPLEX32 + template<> inline int isfinite (CCTK_COMPLEX32 const & x) CCTK_ATTRIBUTE_CONST; + template<> inline int isfinite (CCTK_COMPLEX32 const & x) + { return myisfinite (CCTK_Cmplx32Real (x)) and myisfinite (CCTK_Cmplx32Imag (x)); } +#endif + + // + // isinf + // + + // Default implementation, only good for integers + template <typename T> + inline int isinf (T const & x) CCTK_ATTRIBUTE_CONST; + template <typename T> + inline int isinf (T const & x) + { return 0; } + +#ifdef HAVE_CCTK_REAL4 + template<> inline int isinf (CCTK_REAL4 const & x) CCTK_ATTRIBUTE_CONST; + template<> inline int isinf (CCTK_REAL4 const & x) + { return myisinf (x); } +#endif +#ifdef HAVE_CCTK_REAL8 + template<> inline int isinf (CCTK_REAL8 const & x) CCTK_ATTRIBUTE_CONST; + template<> inline int isinf (CCTK_REAL8 const & x) + { return myisinf (x); } +#endif +#ifdef HAVE_CCTK_REAL16 + template<> inline int isinf (CCTK_REAL16 const & x) CCTK_ATTRIBUTE_CONST; + template<> inline int isinf (CCTK_REAL16 const & x) + { return myisinf (x); } +#endif + +#ifdef HAVE_CCTK_COMPLEX8 + template<> inline int isinf (CCTK_COMPLEX8 const & x) CCTK_ATTRIBUTE_CONST; + template<> inline int isinf (CCTK_COMPLEX8 const & x) + { return myisinf (CCTK_Cmplx8Real (x)) or myisinf (CCTK_Cmplx8Imag (x)); } +#endif +#ifdef HAVE_CCTK_COMPLEX16 + template<> inline int isinf (CCTK_COMPLEX16 const & x) CCTK_ATTRIBUTE_CONST; + template<> inline int isinf (CCTK_COMPLEX16 const & x) + { return myisinf (CCTK_Cmplx16Real (x)) or myisinf (CCTK_Cmplx16Imag (x)); } +#endif +#ifdef HAVE_CCTK_COMPLEX32 + template<> inline int isinf (CCTK_COMPLEX32 const & x) CCTK_ATTRIBUTE_CONST; + template<> inline int isinf (CCTK_COMPLEX32 const & x) + { return myisinf (CCTK_Cmplx32Real (x)) or myisinf (CCTK_Cmplx32Imag (x)); } +#endif + + // // isnan // @@ -333,6 +535,49 @@ namespace CarpetLib { { return myisnan (CCTK_Cmplx32Real (x)) or myisnan (CCTK_Cmplx32Imag (x)); } #endif + // + // isnormal + // + + // Default implementation, only good for integers + template <typename T> + inline int isnormal (T const & x) CCTK_ATTRIBUTE_CONST; + template <typename T> + inline int isnormal (T const & x) + { return 1; } + +#ifdef HAVE_CCTK_REAL4 + template<> inline int isnormal (CCTK_REAL4 const & x) CCTK_ATTRIBUTE_CONST; + template<> inline int isnormal (CCTK_REAL4 const & x) + { return myisnormal (x); } +#endif +#ifdef HAVE_CCTK_REAL8 + template<> inline int isnormal (CCTK_REAL8 const & x) CCTK_ATTRIBUTE_CONST; + template<> inline int isnormal (CCTK_REAL8 const & x) + { return myisnormal (x); } +#endif +#ifdef HAVE_CCTK_REAL16 + template<> inline int isnormal (CCTK_REAL16 const & x) CCTK_ATTRIBUTE_CONST; + template<> inline int isnormal (CCTK_REAL16 const & x) + { return myisnormal (x); } +#endif + +#ifdef HAVE_CCTK_COMPLEX8 + template<> inline int isnormal (CCTK_COMPLEX8 const & x) CCTK_ATTRIBUTE_CONST; + template<> inline int isnormal (CCTK_COMPLEX8 const & x) + { return myisnormal (CCTK_Cmplx8Real (x)) and myisnormal (CCTK_Cmplx8Imag (x)); } +#endif +#ifdef HAVE_CCTK_COMPLEX16 + template<> inline int isnormal (CCTK_COMPLEX16 const & x) CCTK_ATTRIBUTE_CONST; + template<> inline int isnormal (CCTK_COMPLEX16 const & x) + { return myisnormal (CCTK_Cmplx16Real (x)) and myisnormal (CCTK_Cmplx16Imag (x)); } +#endif +#ifdef HAVE_CCTK_COMPLEX32 + template<> inline int isnormal (CCTK_COMPLEX32 const & x) CCTK_ATTRIBUTE_CONST; + template<> inline int isnormal (CCTK_COMPLEX32 const & x) + { return myisnormal (CCTK_Cmplx32Real (x)) and myisnormal (CCTK_Cmplx32Imag (x)); } +#endif + } // namespace good } // namespace CarpetLib |