00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "MdcRecoUtil/ComPackSignedExpFloat.h"
00025 #include <assert.h>
00026 #include <math.h>
00027 using std::endl;
00028 using std::ostream;
00029
00030 ComPackSignedExpFloat::ComPackSignedExpFloat(unsigned nbits,
00031 unsigned maxexponent,
00032 double maxval,
00033 bool invert,
00034 bool center) :
00035 ComPackBase<double>(-maxval,maxval,nbits),
00036 _packer(nbits-1,maxexponent,invert?maxval:0.0,
00037 invert?0.0:maxval, center),
00038 _signbit(1<<nbits-1),_signmask(~(1<<nbits-1))
00039 {
00040 assert(maxval>0.0);
00041 }
00042
00043 ComPackSignedExpFloat::~ComPackSignedExpFloat()
00044 {;}
00045
00046 ComPackBase<double>::StatusCode
00047 ComPackSignedExpFloat::pack (const double value, d_ULong & packdata) const {
00048
00049 ComPackBase<double>::StatusCode retval =
00050 _packer.pack(fabs(value),packdata);
00051 if(retval != TAG_BAD){
00052 if(value>0)
00053 packdata &= _signmask;
00054 else
00055 packdata |= _signbit;
00056 }
00057 return retval;
00058 }
00059
00060 ComPackBase<double>::StatusCode
00061 ComPackSignedExpFloat::unpack (const d_ULong packdata, double & value) const {
00062 ComPackBase<double>::StatusCode retval =
00063 _packer.unpack(packdata,value);
00064 if (value < 0)
00065 value = 0;
00066 else if(packdata&_signbit)
00067 value *= -1.0;
00068 return retval;
00069 }
00070
00071 void
00072 ComPackSignedExpFloat::print(ostream& os) const {
00073 os << "Signed exponential packer using exponential packer as follows:"<<endl;
00074 _packer.print(os);
00075 }
00076
00077
00078
00079
00080
00081