00001 #ifndef FLOATSPECS_H 00002 #define FLOATSPECS_H 00003 00028 #include <float.h> 00029 00035 template < class Float > 00036 class FloatSpecs { 00037 public: 00038 Float ETA; 00040 Float BASE; 00041 Float INFINY; 00042 Float SMALNO; 00043 Float ARE; 00044 Float MRE; 00045 Float LOG_BASE; 00047 public: 00049 FloatSpecs() { 00050 initConstants(); 00051 } 00052 00053 private: 00054 00056 void initConstants() { 00057 getFPSpecs(ETA, INFINY, SMALNO, BASE); 00058 ARE = ETA; 00059 MRE = 2 * sqrt(Float(2.0)) * ETA; 00060 LOG_BASE = log(BASE); 00061 } 00062 00064 static inline void getFPSpecs(float & eta, float & infiny, float & smalno, float & base) { 00065 base = FLT_RADIX; 00066 eta = FLT_EPSILON; 00067 infiny = FLT_MAX; 00068 smalno = FLT_MIN; 00069 } 00070 00072 static inline void getFPSpecs(double & eta, double & infiny, double & smalno, double & base) { 00073 base = DBL_RADIX; 00074 eta = DBL_EPSILON; 00075 infiny = DBL_MAX; 00076 smalno = DBL_MIN; 00077 } 00078 00080 static inline void getFPSpecs(long double & eta, long double & infiny, long double & smalno, long double & base) { 00081 base = LDBL_RADIX; 00082 eta = LDBL_EPSILON; 00083 infiny = LDBL_MAX; 00084 smalno = LDBL_MIN; 00085 } 00086 }; 00087 00088 #endif //FLOATSPECS_H