00001
00002
00011 #ifndef CXXUTILS_FLOATPACKER_H
00012 #define CXXUTILS_FLOATPACKER_H
00013
00014
00015 #include <string>
00016 #include <stdint.h>
00017
00018
00019
00020 namespace CxxUtils {
00021
00022
00052 class FloatPacker
00053 {
00054 public:
00056 typedef uint32_t Packdest;
00057
00058
00069 FloatPacker (int nbits,
00070 int nmantissa,
00071 double scale = 1,
00072 bool is_signed = true,
00073 bool round = false);
00074
00075
00081 bool errcheck (std::string& err) const;
00082
00083
00091 Packdest pack (double src) const;
00092
00093
00099 double unpack (Packdest val) const;
00100
00101
00102 private:
00104 int m_nmantissa;
00105
00107 double m_scale;
00108
00110 double m_invscale;
00111
00113 bool m_is_signed;
00114
00116 bool m_round;
00117
00119 int m_npack;
00120
00122 Packdest m_npack_ones;
00123
00125 Packdest m_signmask;
00126
00128 int m_nexp;
00129
00131 Packdest m_nexp_ones;
00132
00134 int m_min_exp;
00135
00137 int m_max_exp;
00138
00140 mutable std::string m_lasterr;
00141 };
00142
00143
00144 }
00145
00146
00147 #endif // not CXXUTILS_FLOATPACKER_H