precisio.h

00001 //$$ precisio.h                          floating point constants
00002 
00003 #ifndef PRECISION_LIB
00004 #define PRECISION_LIB 0
00005 
00006 #ifdef HAVE_STD
00007 #include <cfloat>
00008 #include <cmath>
00009 #include <cstdlib>
00010 #endif
00011 
00012 #ifdef use_namespace
00013 namespace NEWMAT {
00014 #endif
00015 
00016 #ifdef _STANDARD_                 // standard library available
00017 
00018 #include<limits>
00019 using namespace std;
00020         
00021 class FloatingPointPrecision
00022 {
00023 public:
00024    static int Dig()              // number of decimal digits or precision
00025       { return numeric_limits<Real>::digits10 ; }
00026 
00027    static Real Epsilon()         // smallest number such that 1+Eps!=Eps
00028       { return numeric_limits<Real>::epsilon(); }
00029 
00030    static int Mantissa()         // bits in mantisa
00031       { return numeric_limits<Real>::digits; }
00032 
00033    static Real Maximum()         // maximum value
00034       { return numeric_limits<Real>::max(); }
00035 
00036    static int MaximumDecimalExponent()  // maximum decimal exponent
00037       { return numeric_limits<Real>::max_exponent10; }
00038 
00039    static int MaximumExponent()  // maximum binary exponent
00040       { return numeric_limits<Real>::max_exponent; }
00041 
00042    static Real LnMaximum()       // natural log of maximum
00043       { return (Real)log(Maximum()); }
00044 
00045    static Real Minimum()         // minimum positive value
00046       { return numeric_limits<Real>::min(); } 
00047 
00048    static int MinimumDecimalExponent() // minimum decimal exponent
00049       { return numeric_limits<Real>::min_exponent10; }
00050 
00051    static int MinimumExponent()  // minimum binary exponent
00052       { return numeric_limits<Real>::min_exponent; }
00053 
00054    static Real LnMinimum()       // natural log of minimum
00055       { return (Real)log(Minimum()); }
00056 
00057    static int Radix()            // exponent radix
00058       { return numeric_limits<Real>::radix; }
00059 
00060    static int Rounds()           // addition rounding (1 = does round)
00061    {
00062           return numeric_limits<Real>::round_style ==
00063                  round_to_nearest ? 1 : 0;
00064    }
00065 
00066 };
00067 
00068 
00069 #else                              // _STANDARD_ not defined
00070 
00071 #ifndef SystemV                    // if there is float.h
00072 
00073 
00074 #ifdef USING_FLOAT
00075 
00076 
00077 class FloatingPointPrecision
00078 {
00079 public:
00080    static int Dig()
00081       { return FLT_DIG; }        // number of decimal digits or precision
00082 
00083    static Real Epsilon()
00084       { return FLT_EPSILON; }    // smallest number such that 1+Eps!=Eps
00085 
00086    static int Mantissa()
00087       { return FLT_MANT_DIG; }   // bits in mantisa
00088 
00089    static Real Maximum()
00090       { return FLT_MAX; }        // maximum value
00091 
00092    static int MaximumDecimalExponent()
00093       { return FLT_MAX_10_EXP; } // maximum decimal exponent
00094 
00095    static int MaximumExponent()
00096       { return FLT_MAX_EXP; }    // maximum binary exponent
00097 
00098    static Real LnMaximum()
00099       { return (Real)log(Maximum()); } // natural log of maximum
00100 
00101    static Real Minimum()
00102       { return FLT_MIN; }        // minimum positive value
00103 
00104    static int MinimumDecimalExponent()
00105       { return FLT_MIN_10_EXP; } // minimum decimal exponent
00106 
00107    static int MinimumExponent()
00108       { return FLT_MIN_EXP; }    // minimum binary exponent
00109 
00110    static Real LnMinimum()
00111       { return (Real)log(Minimum()); } // natural log of minimum
00112 
00113    static int Radix()
00114       { return FLT_RADIX; }      // exponent radix
00115 
00116    static int Rounds()
00117       { return FLT_ROUNDS; }     // addition rounding (1 = does round)
00118 
00119 };
00120 
00121 #endif                           // USING_FLOAT
00122 
00123 
00124 #ifdef USING_DOUBLE
00125 
00126 class FloatingPointPrecision
00127 {
00128 public:
00129 
00130    static int Dig()
00131       { return DBL_DIG; }        // number of decimal digits or precision
00132 
00133    static Real Epsilon()
00134       { return DBL_EPSILON; }    // smallest number such that 1+Eps!=Eps
00135 
00136    static int Mantissa()
00137       { return DBL_MANT_DIG; }   // bits in mantisa
00138 
00139    static Real Maximum()
00140       { return DBL_MAX; }        // maximum value
00141 
00142    static int MaximumDecimalExponent()
00143       { return DBL_MAX_10_EXP; } // maximum decimal exponent
00144 
00145    static int MaximumExponent()
00146       { return DBL_MAX_EXP; }    // maximum binary exponent
00147 
00148    static Real LnMaximum()
00149       { return (Real)log(Maximum()); } // natural log of maximum
00150 
00151    static Real Minimum()
00152    {
00153 //#ifdef __BCPLUSPLUS__
00154 //       return 2.225074e-308;     // minimum positive value
00155 //#else
00156        return DBL_MIN;
00157 //#endif
00158    }
00159 
00160    static int MinimumDecimalExponent()
00161       { return DBL_MIN_10_EXP; } // minimum decimal exponent
00162 
00163    static int MinimumExponent()
00164       { return DBL_MIN_EXP; }    // minimum binary exponent
00165 
00166    static Real LnMinimum()
00167       { return (Real)log(Minimum()); } // natural log of minimum
00168 
00169 
00170    static int Radix()
00171       { return FLT_RADIX; }      // exponent radix
00172 
00173    static int Rounds()
00174       { return FLT_ROUNDS; }     // addition rounding (1 = does round)
00175 
00176 };
00177 
00178 #endif                             // USING_DOUBLE
00179 
00180 #else                              // if there is no float.h
00181 
00182 #ifdef USING_FLOAT
00183 
00184 class FloatingPointPrecision
00185 {
00186 public:
00187 
00188    static Real Epsilon()
00189       { return pow(2.0,(int)(1-FSIGNIF)); }
00190                                    // smallest number such that 1+Eps!=Eps
00191 
00192    static Real Maximum()
00193       { return MAXFLOAT; }            // maximum value
00194 
00195    static Real LnMaximum()
00196       { return (Real)log(Maximum()); }  // natural log of maximum
00197 
00198    static Real Minimum()
00199       { return MINFLOAT; }             // minimum positive value
00200 
00201    static Real LnMinimum()
00202       { return (Real)log(Minimum()); }  // natural log of minimum
00203 
00204 };
00205 
00206 #endif                                  // USING_FLOAT
00207 
00208 
00209 #ifdef USING_DOUBLE
00210 
00211 class FloatingPointPrecision
00212 {
00213 public:
00214 
00215    static Real Epsilon()
00216       { return pow(2.0,(int)(1-DSIGNIF)); }
00217                                       // smallest number such that 1+Eps!=Eps
00218 
00219    static Real Maximum()
00220       { return MAXDOUBLE; }           // maximum value
00221 
00222    static Real LnMaximum()
00223       { return LN_MAXDOUBLE; }        // natural log of maximum
00224 
00225 #ifdef IEEE
00226    static Real Minimum()
00227       { return MINDOUBLE; }
00228 #else
00229    static Real Minimum()
00230       { return DBL_MIN; }
00231 #endif
00232 
00233    static Real LnMinimum()
00234       { return LN_MINDOUBLE; }        // natural log of minimum
00235 };
00236 
00237 #endif                                // USING_DOUBLE
00238 
00239 #endif                                // SystemV
00240 
00241 #endif                                // _STANDARD_
00242 
00243 #ifdef use_namespace
00244 }
00245 #endif                                // use_namespace
00246 
00247 
00248 
00249 #endif                                // PRECISION_LIB
Generated on Mon Jan 24 12:04:37 2011 for FASTlib by  doxygen 1.6.3