precisio.h
00001
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()
00025 { return numeric_limits<Real>::digits10 ; }
00026
00027 static Real Epsilon()
00028 { return numeric_limits<Real>::epsilon(); }
00029
00030 static int Mantissa()
00031 { return numeric_limits<Real>::digits; }
00032
00033 static Real Maximum()
00034 { return numeric_limits<Real>::max(); }
00035
00036 static int MaximumDecimalExponent()
00037 { return numeric_limits<Real>::max_exponent10; }
00038
00039 static int MaximumExponent()
00040 { return numeric_limits<Real>::max_exponent; }
00041
00042 static Real LnMaximum()
00043 { return (Real)log(Maximum()); }
00044
00045 static Real Minimum()
00046 { return numeric_limits<Real>::min(); }
00047
00048 static int MinimumDecimalExponent()
00049 { return numeric_limits<Real>::min_exponent10; }
00050
00051 static int MinimumExponent()
00052 { return numeric_limits<Real>::min_exponent; }
00053
00054 static Real LnMinimum()
00055 { return (Real)log(Minimum()); }
00056
00057 static int Radix()
00058 { return numeric_limits<Real>::radix; }
00059
00060 static int Rounds()
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; }
00082
00083 static Real Epsilon()
00084 { return FLT_EPSILON; }
00085
00086 static int Mantissa()
00087 { return FLT_MANT_DIG; }
00088
00089 static Real Maximum()
00090 { return FLT_MAX; }
00091
00092 static int MaximumDecimalExponent()
00093 { return FLT_MAX_10_EXP; }
00094
00095 static int MaximumExponent()
00096 { return FLT_MAX_EXP; }
00097
00098 static Real LnMaximum()
00099 { return (Real)log(Maximum()); }
00100
00101 static Real Minimum()
00102 { return FLT_MIN; }
00103
00104 static int MinimumDecimalExponent()
00105 { return FLT_MIN_10_EXP; }
00106
00107 static int MinimumExponent()
00108 { return FLT_MIN_EXP; }
00109
00110 static Real LnMinimum()
00111 { return (Real)log(Minimum()); }
00112
00113 static int Radix()
00114 { return FLT_RADIX; }
00115
00116 static int Rounds()
00117 { return FLT_ROUNDS; }
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; }
00132
00133 static Real Epsilon()
00134 { return DBL_EPSILON; }
00135
00136 static int Mantissa()
00137 { return DBL_MANT_DIG; }
00138
00139 static Real Maximum()
00140 { return DBL_MAX; }
00141
00142 static int MaximumDecimalExponent()
00143 { return DBL_MAX_10_EXP; }
00144
00145 static int MaximumExponent()
00146 { return DBL_MAX_EXP; }
00147
00148 static Real LnMaximum()
00149 { return (Real)log(Maximum()); }
00150
00151 static Real Minimum()
00152 {
00153
00154
00155
00156 return DBL_MIN;
00157
00158 }
00159
00160 static int MinimumDecimalExponent()
00161 { return DBL_MIN_10_EXP; }
00162
00163 static int MinimumExponent()
00164 { return DBL_MIN_EXP; }
00165
00166 static Real LnMinimum()
00167 { return (Real)log(Minimum()); }
00168
00169
00170 static int Radix()
00171 { return FLT_RADIX; }
00172
00173 static int Rounds()
00174 { return FLT_ROUNDS; }
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
00191
00192 static Real Maximum()
00193 { return MAXFLOAT; }
00194
00195 static Real LnMaximum()
00196 { return (Real)log(Maximum()); }
00197
00198 static Real Minimum()
00199 { return MINFLOAT; }
00200
00201 static Real LnMinimum()
00202 { return (Real)log(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
00218
00219 static Real Maximum()
00220 { return MAXDOUBLE; }
00221
00222 static Real LnMaximum()
00223 { return LN_MAXDOUBLE; }
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; }
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