| 1 | /// \ingroup newmat | 
|---|
| 2 | ///@{ | 
|---|
| 3 |  | 
|---|
| 4 | /// \file precisio.h | 
|---|
| 5 | /// Floating point precision constants. | 
|---|
| 6 |  | 
|---|
| 7 | #ifndef PRECISION_LIB | 
|---|
| 8 | #define PRECISION_LIB 0 | 
|---|
| 9 |  | 
|---|
| 10 | #define WANT_MATH | 
|---|
| 11 | #include "include.h"              // in case being used as stand alone | 
|---|
| 12 |  | 
|---|
| 13 | #ifdef _STANDARD_                 // standard library available | 
|---|
| 14 | #include <limits> | 
|---|
| 15 | #endif | 
|---|
| 16 |  | 
|---|
| 17 | #ifdef use_namespace | 
|---|
| 18 | namespace NEWMAT { | 
|---|
| 19 | #endif | 
|---|
| 20 |  | 
|---|
| 21 | #ifdef _STANDARD_                 // standard library available | 
|---|
| 22 |  | 
|---|
| 23 | #ifdef OPT_COMPATIBLE | 
|---|
| 24 | #include <cfloat>                 // for FLT_MAX | 
|---|
| 25 | #endif | 
|---|
| 26 |  | 
|---|
| 27 | /// Floating point precision. | 
|---|
| 28 | class FloatingPointPrecision | 
|---|
| 29 | { | 
|---|
| 30 | public: | 
|---|
| 31 | static int Dig()              // number of decimal digits or precision | 
|---|
| 32 | { return std::numeric_limits<Real>::digits10 ; } | 
|---|
| 33 |  | 
|---|
| 34 | static Real Epsilon()         // smallest number such that 1+Eps!=Eps | 
|---|
| 35 | { return std::numeric_limits<Real>::epsilon(); } | 
|---|
| 36 |  | 
|---|
| 37 | static int Mantissa()         // bits in mantisa | 
|---|
| 38 | { return std::numeric_limits<Real>::digits; } | 
|---|
| 39 |  | 
|---|
| 40 | static Real Maximum()         // maximum value | 
|---|
| 41 | { return std::numeric_limits<Real>::max(); } | 
|---|
| 42 |  | 
|---|
| 43 | static int MaximumDecimalExponent()  // maximum decimal exponent | 
|---|
| 44 | { return std::numeric_limits<Real>::max_exponent10; } | 
|---|
| 45 |  | 
|---|
| 46 | static int MaximumExponent()  // maximum binary exponent | 
|---|
| 47 | { return std::numeric_limits<Real>::max_exponent; } | 
|---|
| 48 |  | 
|---|
| 49 | static Real LnMaximum()       // natural log of maximum | 
|---|
| 50 | { return (Real)log(Maximum()); } | 
|---|
| 51 |  | 
|---|
| 52 | static Real Minimum()         // minimum positive value | 
|---|
| 53 | { return std::numeric_limits<Real>::min(); } | 
|---|
| 54 |  | 
|---|
| 55 | static int MinimumDecimalExponent() // minimum decimal exponent | 
|---|
| 56 | { return std::numeric_limits<Real>::min_exponent10; } | 
|---|
| 57 |  | 
|---|
| 58 | static int MinimumExponent()  // minimum binary exponent | 
|---|
| 59 | { return std::numeric_limits<Real>::min_exponent; } | 
|---|
| 60 |  | 
|---|
| 61 | static Real LnMinimum()       // natural log of minimum | 
|---|
| 62 | { return (Real)log(Minimum()); } | 
|---|
| 63 |  | 
|---|
| 64 | static int Radix()            // exponent radix | 
|---|
| 65 | { return std::numeric_limits<Real>::radix; } | 
|---|
| 66 |  | 
|---|
| 67 | static int Rounds()           // addition rounding (1 = does round) | 
|---|
| 68 | { | 
|---|
| 69 | return std::numeric_limits<Real>::round_style == | 
|---|
| 70 | std::round_to_nearest ? 1 : 0; | 
|---|
| 71 | } | 
|---|
| 72 |  | 
|---|
| 73 | }; | 
|---|
| 74 |  | 
|---|
| 75 |  | 
|---|
| 76 | #else                              // _STANDARD_ not defined | 
|---|
| 77 |  | 
|---|
| 78 | #ifndef SystemV                    // if there is float.h | 
|---|
| 79 |  | 
|---|
| 80 | #ifdef USING_FLOAT | 
|---|
| 81 |  | 
|---|
| 82 | /// Floating point precision (type float). | 
|---|
| 83 | class FloatingPointPrecision | 
|---|
| 84 | { | 
|---|
| 85 | public: | 
|---|
| 86 | static int Dig() | 
|---|
| 87 | { return FLT_DIG; }        // number of decimal digits or precision | 
|---|
| 88 |  | 
|---|
| 89 | static Real Epsilon() | 
|---|
| 90 | { return FLT_EPSILON; }    // smallest number such that 1+Eps!=Eps | 
|---|
| 91 |  | 
|---|
| 92 | static int Mantissa() | 
|---|
| 93 | { return FLT_MANT_DIG; }   // bits in mantisa | 
|---|
| 94 |  | 
|---|
| 95 | static Real Maximum() | 
|---|
| 96 | { return FLT_MAX; }        // maximum value | 
|---|
| 97 |  | 
|---|
| 98 | static int MaximumDecimalExponent() | 
|---|
| 99 | { return FLT_MAX_10_EXP; } // maximum decimal exponent | 
|---|
| 100 |  | 
|---|
| 101 | static int MaximumExponent() | 
|---|
| 102 | { return FLT_MAX_EXP; }    // maximum binary exponent | 
|---|
| 103 |  | 
|---|
| 104 | static Real LnMaximum() | 
|---|
| 105 | { return (Real)log(Maximum()); } // natural log of maximum | 
|---|
| 106 |  | 
|---|
| 107 | static Real Minimum() | 
|---|
| 108 | { return FLT_MIN; }        // minimum positive value | 
|---|
| 109 |  | 
|---|
| 110 | static int MinimumDecimalExponent() | 
|---|
| 111 | { return FLT_MIN_10_EXP; } // minimum decimal exponent | 
|---|
| 112 |  | 
|---|
| 113 | static int MinimumExponent() | 
|---|
| 114 | { return FLT_MIN_EXP; }    // minimum binary exponent | 
|---|
| 115 |  | 
|---|
| 116 | static Real LnMinimum() | 
|---|
| 117 | { return (Real)log(Minimum()); } // natural log of minimum | 
|---|
| 118 |  | 
|---|
| 119 | static int Radix() | 
|---|
| 120 | { return FLT_RADIX; }      // exponent radix | 
|---|
| 121 |  | 
|---|
| 122 | static int Rounds() | 
|---|
| 123 | { return FLT_ROUNDS; }     // addition rounding (1 = does round) | 
|---|
| 124 |  | 
|---|
| 125 | }; | 
|---|
| 126 |  | 
|---|
| 127 | #endif                           // USING_FLOAT | 
|---|
| 128 |  | 
|---|
| 129 |  | 
|---|
| 130 | #ifdef USING_DOUBLE | 
|---|
| 131 |  | 
|---|
| 132 | /// Floating point precision (type double). | 
|---|
| 133 | class FloatingPointPrecision | 
|---|
| 134 | { | 
|---|
| 135 | public: | 
|---|
| 136 |  | 
|---|
| 137 | static int Dig() | 
|---|
| 138 | { return DBL_DIG; }        // number of decimal digits or precision | 
|---|
| 139 |  | 
|---|
| 140 | static Real Epsilon() | 
|---|
| 141 | { return DBL_EPSILON; }    // smallest number such that 1+Eps!=Eps | 
|---|
| 142 |  | 
|---|
| 143 | static int Mantissa() | 
|---|
| 144 | { return DBL_MANT_DIG; }   // bits in mantisa | 
|---|
| 145 |  | 
|---|
| 146 | static Real Maximum() | 
|---|
| 147 | { return DBL_MAX; }        // maximum value | 
|---|
| 148 |  | 
|---|
| 149 | static int MaximumDecimalExponent() | 
|---|
| 150 | { return DBL_MAX_10_EXP; } // maximum decimal exponent | 
|---|
| 151 |  | 
|---|
| 152 | static int MaximumExponent() | 
|---|
| 153 | { return DBL_MAX_EXP; }    // maximum binary exponent | 
|---|
| 154 |  | 
|---|
| 155 | static Real LnMaximum() | 
|---|
| 156 | { return (Real)log(Maximum()); } // natural log of maximum | 
|---|
| 157 |  | 
|---|
| 158 | static Real Minimum() | 
|---|
| 159 | { | 
|---|
| 160 | //#ifdef __BCPLUSPLUS__ | 
|---|
| 161 | //       return 2.225074e-308;     // minimum positive value | 
|---|
| 162 | //#else | 
|---|
| 163 | return DBL_MIN; | 
|---|
| 164 | //#endif | 
|---|
| 165 | } | 
|---|
| 166 |  | 
|---|
| 167 | static int MinimumDecimalExponent() | 
|---|
| 168 | { return DBL_MIN_10_EXP; } // minimum decimal exponent | 
|---|
| 169 |  | 
|---|
| 170 | static int MinimumExponent() | 
|---|
| 171 | { return DBL_MIN_EXP; }    // minimum binary exponent | 
|---|
| 172 |  | 
|---|
| 173 | static Real LnMinimum() | 
|---|
| 174 | { return (Real)log(Minimum()); } // natural log of minimum | 
|---|
| 175 |  | 
|---|
| 176 |  | 
|---|
| 177 | static int Radix() | 
|---|
| 178 | { return FLT_RADIX; }      // exponent radix | 
|---|
| 179 |  | 
|---|
| 180 | static int Rounds() | 
|---|
| 181 | { return FLT_ROUNDS; }     // addition rounding (1 = does round) | 
|---|
| 182 |  | 
|---|
| 183 | }; | 
|---|
| 184 |  | 
|---|
| 185 | #endif                             // USING_DOUBLE | 
|---|
| 186 |  | 
|---|
| 187 | #else                              // if there is no float.h | 
|---|
| 188 |  | 
|---|
| 189 | #ifdef OPT_COMPATIBLE | 
|---|
| 190 | #define FLT_MAX MAXFLOAT | 
|---|
| 191 | #endif | 
|---|
| 192 |  | 
|---|
| 193 |  | 
|---|
| 194 | #ifdef USING_FLOAT | 
|---|
| 195 |  | 
|---|
| 196 | /// Floating point precision (type float). | 
|---|
| 197 | class FloatingPointPrecision | 
|---|
| 198 | { | 
|---|
| 199 | public: | 
|---|
| 200 |  | 
|---|
| 201 | static Real Epsilon() | 
|---|
| 202 | { return pow(2.0,(int)(1-FSIGNIF)); } | 
|---|
| 203 | // smallest number such that 1+Eps!=Eps | 
|---|
| 204 |  | 
|---|
| 205 | static Real Maximum() | 
|---|
| 206 | { return MAXFLOAT; }            // maximum value | 
|---|
| 207 |  | 
|---|
| 208 | static Real LnMaximum() | 
|---|
| 209 | { return (Real)log(Maximum()); }  // natural log of maximum | 
|---|
| 210 |  | 
|---|
| 211 | static Real Minimum() | 
|---|
| 212 | { return MINFLOAT; }             // minimum positive value | 
|---|
| 213 |  | 
|---|
| 214 | static Real LnMinimum() | 
|---|
| 215 | { return (Real)log(Minimum()); }  // natural log of minimum | 
|---|
| 216 |  | 
|---|
| 217 | }; | 
|---|
| 218 |  | 
|---|
| 219 | #endif                                  // USING_FLOAT | 
|---|
| 220 |  | 
|---|
| 221 |  | 
|---|
| 222 | #ifdef USING_DOUBLE | 
|---|
| 223 |  | 
|---|
| 224 | /// Floating point precision (type double). | 
|---|
| 225 | class FloatingPointPrecision | 
|---|
| 226 | { | 
|---|
| 227 | public: | 
|---|
| 228 |  | 
|---|
| 229 | static Real Epsilon() | 
|---|
| 230 | { return pow(2.0,(int)(1-DSIGNIF)); } | 
|---|
| 231 | // smallest number such that 1+Eps!=Eps | 
|---|
| 232 |  | 
|---|
| 233 | static Real Maximum() | 
|---|
| 234 | { return MAXDOUBLE; }           // maximum value | 
|---|
| 235 |  | 
|---|
| 236 | static Real LnMaximum() | 
|---|
| 237 | { return LN_MAXDOUBLE; }        // natural log of maximum | 
|---|
| 238 |  | 
|---|
| 239 | static Real Minimum() | 
|---|
| 240 | { return MINDOUBLE; } | 
|---|
| 241 |  | 
|---|
| 242 | static Real LnMinimum() | 
|---|
| 243 | { return LN_MINDOUBLE; }        // natural log of minimum | 
|---|
| 244 | }; | 
|---|
| 245 |  | 
|---|
| 246 | #endif                                // USING_DOUBLE | 
|---|
| 247 |  | 
|---|
| 248 | #endif                                // SystemV | 
|---|
| 249 |  | 
|---|
| 250 | #endif                                // _STANDARD_ | 
|---|
| 251 |  | 
|---|
| 252 |  | 
|---|
| 253 |  | 
|---|
| 254 |  | 
|---|
| 255 | #ifdef use_namespace | 
|---|
| 256 | } | 
|---|
| 257 | #endif                                // use_namespace | 
|---|
| 258 |  | 
|---|
| 259 |  | 
|---|
| 260 |  | 
|---|
| 261 | #endif                                // PRECISION_LIB | 
|---|
| 262 |  | 
|---|
| 263 |  | 
|---|
| 264 | ///@} | 
|---|