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