basix_doc 0.1
|
00001 00002 /****************************************************************************** 00003 * MODULE : double.hpp 00004 * DESCRIPTION: Extra routines for doubles 00005 * COPYRIGHT : (C) 2004 Joris van der Hoeven 00006 ******************************************************************************* 00007 * This software falls under the GNU general public license and comes WITHOUT 00008 * ANY WARRANTY WHATSOEVER. See the file $TEXMACS_PATH/LICENSE for more details. 00009 * If you don't have this file, write to the Free Software Foundation, Inc., 00010 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 00011 ******************************************************************************/ 00012 00013 #ifndef __MMX__DOUBLE_HPP__ 00014 #define __MMX__DOUBLE_HPP__ 00015 #include <fenv.h> 00016 #include <basix/port.hpp> 00017 00019 00020 namespace mmx { 00021 00022 /****************************************************************************** 00023 * Constants 00024 ******************************************************************************/ 00025 00026 inline void set_nan (double& x) { x= NAN; } 00027 inline void set_maximal (double& x) { x= HUGE_VAL; } 00028 inline void set_minimal (double& x) { x= -HUGE_VAL; } 00029 inline void set_infinity (double& x) { x= HUGE_VAL; } 00030 inline void set_fuzz (double& x) { x= 0.0; } 00031 inline void set_smallest (double& x) { x= nextafter (0.0, HUGE_VAL); } 00032 inline void set_largest (double& x) { x= nextafter (HUGE_VAL, 0.0); } 00033 inline void set_accuracy (double& x) { x= __DBL_EPSILON__; } 00034 inline void set_log2 (double& x) { x= 0.6931471805599453094172321214581766L; } 00035 inline void set_pi (double& x) { x= 3.1415926535897932384626433832795029L; } 00036 inline void set_euler (double& x) { x= 0.5772156649015328606065120900824024L; } 00037 inline double times_infinity (const double& x) { return x * HUGE_VAL; } 00038 00039 /****************************************************************************** 00040 * Elementary functions 00041 ******************************************************************************/ 00042 00043 inline double sqrt (const double& x) { return std::sqrt (x); } 00044 inline double exp (const double& x) { return std::exp (x); } 00045 inline double exp2 (const double& x) { return ::exp2 (x); } 00046 inline double log (const double& x) { return std::log (x); } 00047 inline double log2 (const double& x) { return ::log2 (x); } 00048 inline double cos (const double& x) { return std::cos (x); } 00049 inline double sin (const double& x) { return std::sin (x); } 00050 inline double tan (const double& x) { return std::tan (x); } 00051 inline double cosh (const double& x) { return std::cosh (x); } 00052 inline double sinh (const double& x) { return std::sinh (x); } 00053 inline double tanh (const double& x) { return std::tanh (x); } 00054 inline double acos (const double& x) { return std::acos (x); } 00055 inline double asin (const double& x) { return std::asin (x); } 00056 inline double atan (const double& x) { return std::atan (x); } 00057 inline double hypot (const double& x, const double& y) { 00058 return ::hypot (x, y); } 00059 inline double atan2 (const double& y, const double& x) { 00060 return std::atan2 (y, x); } 00061 inline double pow (const double& x, const double& y) { 00062 return std::pow (x, y); } 00063 inline double pow (const double& x, const int& y) { 00064 return std::pow (x, (double) y); } 00065 inline double pow (const int& x, const double& y) { 00066 return std::pow ((double) x, y); } 00067 00068 INV_TRIGO_SUGAR(,double) 00069 INV_HYPER_SUGAR(,double) 00070 ARG_HYPER_SUGAR(,double) 00071 00072 /****************************************************************************** 00073 * Floating point related functions 00074 ******************************************************************************/ 00075 00076 inline bool is_finite (const double& x) { return std::isfinite (x); } 00077 inline bool is_infinite (const double& x) { return std::isinf (x); } 00078 inline bool is_fuzz (const double& x) { (void) x; return false; } 00079 inline bool is_nan (const double& x) { return std::isnan (x); } 00080 inline bool is_reliable (const double& x) { (void) x; return false; } 00081 00082 inline xnat precision (const double& x) { (void) x; return 51; } 00083 inline double next_above (const double& x) { return nextafter (x, HUGE_VAL); } 00084 inline double next_below (const double& x) { return nextafter (x, -HUGE_VAL); } 00085 inline double rounding_error (const double& x) { 00086 return ldexp (abs (x), -50) + __DBL_MIN__; } 00087 inline double additive_error (const double& x) { 00088 return ldexp (abs (x), -50); } 00089 00090 STMPL inline double magnitude (const double& x) { return log2 (x); } 00091 inline xint exponent (const double& x) { 00092 return (xint) max (-10000.0, logb (x)); } 00093 00094 /****************************************************************************** 00095 * Shifting 00096 ******************************************************************************/ 00097 00098 template<typename S> inline double 00099 incexp2 (const double& x, const S& y) { return ldexp (x, y); } 00100 inline double 00101 incexp2 (const double& x) { return ldexp (x, 1); } 00102 template<typename S> inline void 00103 incexp2_assign (double& x, const S& y) { x= ldexp (x, y); } 00104 template<typename S> inline void 00105 incexp2 (double& x, const double& y, const S& z) { x= ldexp (y, z); } 00106 template<typename S> inline double 00107 decexp2 (const double& x, const S& y) { return ldexp (x, -y); } 00108 inline double 00109 decexp2 (const double& x) { return ldexp (x, -1); } 00110 template<typename S> inline void 00111 decexp2_assign (double& x, const S& y) { x= ldexp (x, -y); } 00112 template<typename S> inline void 00113 decexp2 (double& x, const double& y, const S& z) { x= ldexp (y, -z); } 00114 00115 /****************************************************************************** 00116 * Other functions 00117 ******************************************************************************/ 00118 00119 inline int as_int (const double& x) { return (int) x; } 00120 inline double as_double (const double& x) { return x; } 00121 00122 inline double square (const double& x) { return x * x; } 00123 inline double invert (const double& x) { return 1.0 / x; } 00124 00125 inline double floor (const double& x) { return std::floor (x); } 00126 inline double trunc (const double& x) { return ::trunc (x); } 00127 inline double ceil (const double& x) { return std::ceil (x); } 00128 inline double round (const double& x) { return std::floor (x + 0.5); } 00129 00130 double uniform_deviate (const double& lo, const double& hi); 00131 00132 /****************************************************************************** 00133 * Utility macros for avoiding ambiguities 00134 ******************************************************************************/ 00135 00136 #define mmx_sqrt mmx::sqrt 00137 #define mmx_hypot mmx::hypot 00138 #define mmx_pow mmx::pow 00139 #define mmx_exp mmx::exp 00140 #define mmx_exp2 mmx::exp2 00141 #define mmx_log mmx::log 00142 #define mmx_log2 mmx::log2 00143 #define mmx_cos mmx::cos 00144 #define mmx_sin mmx::sin 00145 #define mmx_tan mmx::tan 00146 #define mmx_cosh mmx::cosh 00147 #define mmx_sinh mmx::sinh 00148 #define mmx_tanh mmx::tanh 00149 #define mmx_acos mmx::acos 00150 #define mmx_asin mmx::asin 00151 #define mmx_atan mmx::atan 00152 #define mmx_atan2 mmx::atan2 00153 #define mmx_floor mmx::floor 00154 #define mmx_trunc mmx::trunc 00155 #define mmx_ceil mmx::ceil 00156 #define mmx_round mmx::round 00157 00158 } 00159 #endif // __MMX__DOUBLE_HPP__