basix_doc 0.1
/Users/mourrain/Devel/mmx/basix/include/basix/double.hpp
Go to the documentation of this file.
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__
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines