ComPackExpFloat Class Reference

#include <ComPackExpFloat.h>

Inheritance diagram for ComPackExpFloat:

ComPackBase< double > ComPackBaseBase List of all members.

Public Types

 TAG_OK
 TAG_BAD
 TAG_RANGE_ERROR
 TAG_VAL_ROUND_DOWN
 TAG_VAL_ROUND_UP
enum  StatusCode {
  TAG_OK, TAG_BAD, TAG_RANGE_ERROR, TAG_VAL_ROUND_DOWN,
  TAG_VAL_ROUND_UP
}

Public Member Functions

 ComPackExpFloat (unsigned nbits, unsigned maxexponent, double start, double stop, bool center=false)
virtual ~ComPackExpFloat ()
virtual StatusCode pack (const double, d_ULong &) const
virtual StatusCode unpack (const d_ULong, double &) const
void print (std::ostream &os) const
virtual StatusCode pack (const double, d_ULong &) const =0
virtual const double & getMinVal () const
virtual const double & getMaxVal () const
virtual const double & getRange () const
d_ULong bitRange () const
d_ULong bitMask () const

Protected Attributes

double _minVal
double _maxVal
double _valRange
d_ULong _bitRange
d_ULong _bitMask

Private Member Functions

 ComPackExpFloat (const ComPackExpFloat &)
ComPackExpFloatoperator= (const ComPackExpFloat &)

Private Attributes

unsigned _maxexp
unsigned _expmsk
unsigned _mansft
unsigned _manmsk
unsigned _maxman
double _invrange
double * _expfac
double * _expoff

Detailed Description

Definition at line 35 of file ComPackExpFloat.h.


Member Enumeration Documentation

enum ComPackBaseBase::StatusCode [inherited]

Enumerator:
TAG_OK 
TAG_BAD 
TAG_RANGE_ERROR 
TAG_VAL_ROUND_DOWN 
TAG_VAL_ROUND_UP 

Definition at line 35 of file ComPackBaseBase.h.


Constructor & Destructor Documentation

ComPackExpFloat::ComPackExpFloat ( unsigned  nbits,
unsigned  maxexponent,
double  start,
double  stop,
bool  center = false 
)

Definition at line 31 of file ComPackExpFloat.cxx.

References ComPackBase< double >::_bitRange, _expfac, _expmsk, _expoff, _invrange, _manmsk, _mansft, _maxexp, _maxman, ComPackBase< double >::_maxVal, ComPackBase< double >::_minVal, ComPackBase< double >::_valRange, alpha, and one.

00035                                                :
00036   ComPackBase<double>(start,stop,nbits),
00037   _maxexp(maxexponent) {
00038   if(_maxexp > 62 ) {
00039     std::cout<<"ErrMsg(fatal) "<< "Can't pack exponents larger than 62" << endl;
00040     abort();
00041   }
00042   static double invln2(1.0/log(2.0));
00043   long long one(1);
00044 // compute how many bits used by exponent
00045   _mansft = _maxexp>0?(unsigned)(log(double(_maxexp))*invln2+1.01):0;
00046   _expmsk = (1<<_mansft)-1;
00047   _maxman = (1<<(_bitRange-_mansft));
00048   _manmsk = _maxman-1;
00049   double invmaxman = 1.0/_maxman;
00050   long long maxnorm = (one<<(maxexponent+1))-1;
00051 // correct the range if we're centering the bins
00052   if(center) {
00053     long long norm = one<<maxexponent;
00054     double alpha = 1.0/((double)maxnorm*_maxman*2.0 - (norm + 1.0));
00055     _minVal -= _valRange*alpha;
00056     _maxVal += _valRange*norm*alpha;
00057     _valRange = _maxVal - _minVal;
00058 //    cout << "alpha = " << alpha << " norm = " << norm << endl;
00059   }
00060 // finish the calculations
00061   _invrange = maxnorm/_valRange;
00062   double invmaxnorm = _valRange/maxnorm;
00063   double manoff = (0.5 * invmaxman+1.0) * invmaxnorm;
00064   double valoff = _minVal -  invmaxnorm;
00065   double manfac = invmaxnorm * invmaxman;
00066 // pre-compute some factors and store them in an array
00067   _expfac = new double[_maxexp+1];
00068   _expoff = new double[_maxexp+1];
00069   for(unsigned iexp=0;iexp<=_maxexp;iexp++){
00070     double expf = (one<<iexp);
00071     _expoff[iexp] = valoff + manoff*expf;
00072     _expfac[iexp] = manfac*expf;
00073   }
00074 }

ComPackExpFloat::~ComPackExpFloat (  )  [virtual]

Definition at line 76 of file ComPackExpFloat.cxx.

References _expfac, and _expoff.

00077 {
00078   delete [] _expfac;
00079   delete [] _expoff;
00080 }

ComPackExpFloat::ComPackExpFloat ( const ComPackExpFloat  )  [private]


Member Function Documentation

d_ULong ComPackBase< double >::bitMask (  )  const [inline, inherited]

Definition at line 75 of file ComPackBase.h.

References ComPackBase< T >::_bitMask.

00075 { return _bitMask; }

d_ULong ComPackBase< double >::bitRange (  )  const [inline, inherited]

Definition at line 74 of file ComPackBase.h.

References ComPackBase< T >::_bitRange.

00074 { return _bitRange; }

virtual const double & ComPackBase< double >::getMaxVal (  )  const [inline, virtual, inherited]

Definition at line 71 of file ComPackBase.h.

References ComPackBase< T >::_maxVal.

00071 { return _maxVal;};

virtual const double & ComPackBase< double >::getMinVal (  )  const [inline, virtual, inherited]

Definition at line 70 of file ComPackBase.h.

References ComPackBase< T >::_minVal.

00070 { return _minVal;};

virtual const double & ComPackBase< double >::getRange (  )  const [inline, virtual, inherited]

Definition at line 72 of file ComPackBase.h.

References ComPackBase< T >::_valRange.

00072 { return _valRange;};

ComPackExpFloat& ComPackExpFloat::operator= ( const ComPackExpFloat  )  [private]

virtual StatusCode ComPackBase< double >::pack ( const   T,
d_ULong  
) const [pure virtual, inherited]

ComPackBase< double >::StatusCode ComPackExpFloat::pack ( const   double,
d_ULong  
) const [virtual]

Definition at line 83 of file ComPackExpFloat.cxx.

References _expmsk, _invrange, _manmsk, _mansft, _maxexp, _maxman, ComPackBase< double >::_minVal, one, ComPackBaseBase::TAG_OK, ComPackBaseBase::TAG_VAL_ROUND_DOWN, and ComPackBaseBase::TAG_VAL_ROUND_UP.

Referenced by ComPackSignedExpFloat::pack().

00083                                                                    {
00084   static double invln2(1.0/log(2.0));
00085   static long long one(1);
00086   ComPackBase<double>::StatusCode retval(TAG_OK);
00087 // first, figure out the exponent
00088   double renorm = 1.0+(value-_minVal)*_invrange;
00089   if(renorm<1.0){
00090     renorm=1.0;
00091     retval = TAG_VAL_ROUND_UP;
00092   }
00093   unsigned iexp = unsigned(log(renorm)*invln2);
00094   unsigned iman(0);
00095   if(iexp<=_maxexp){
00096     long long expon = one<<iexp;
00097     iman = (unsigned)( _maxman*(renorm/expon - 1.0) );
00098 // deal with floating-point rounding, which could give a 'non-physical' result
00099     if(iman==_maxman){
00100       if(iexp==_maxexp)
00101         iman=_maxman-1;
00102       else {
00103         iman=0;
00104         iexp++;
00105       }
00106     }
00107   } else {
00108     iexp=_maxexp;
00109     iman = _maxman-1;
00110     retval = TAG_VAL_ROUND_DOWN;
00111   }
00112   packdata = (iexp&_expmsk) | (iman&_manmsk)<<_mansft;
00113   return retval;
00114 }

void ComPackExpFloat::print ( std::ostream os  )  const

ComPackBase< double >::StatusCode ComPackExpFloat::unpack ( const   d_ULong,
double &   
) const [virtual]

Implements ComPackBase< double >.

Definition at line 117 of file ComPackExpFloat.cxx.

References _expfac, _expmsk, _expoff, _manmsk, _mansft, and ComPackBaseBase::TAG_OK.

Referenced by ComPackSignedExpFloat::unpack().

00117                                                                      {
00118   size_t iman = (packdata>>_mansft)&_manmsk;
00119   size_t iexp = packdata&_expmsk;
00120   value = _expoff[iexp] + iman * _expfac[iexp];
00121   return TAG_OK;
00122 }


Member Data Documentation

d_ULong ComPackBase< double >::_bitMask [protected, inherited]

Definition at line 88 of file ComPackBase.h.

Referenced by ComPackFlatFloat::ComPackFlatFloat(), ComPackFlatFloat::pack(), and ComPackFlatFloat::unpack().

d_ULong ComPackBase< double >::_bitRange [protected, inherited]

Definition at line 87 of file ComPackBase.h.

Referenced by ComPackExpFloat(), and ComPackFlatFloat::ComPackFlatFloat().

double* ComPackExpFloat::_expfac [private]

Definition at line 63 of file ComPackExpFloat.h.

Referenced by ComPackExpFloat(), unpack(), and ~ComPackExpFloat().

unsigned ComPackExpFloat::_expmsk [private]

Definition at line 57 of file ComPackExpFloat.h.

Referenced by ComPackExpFloat(), pack(), and unpack().

double* ComPackExpFloat::_expoff [private]

Definition at line 64 of file ComPackExpFloat.h.

Referenced by ComPackExpFloat(), unpack(), and ~ComPackExpFloat().

double ComPackExpFloat::_invrange [private]

Definition at line 61 of file ComPackExpFloat.h.

Referenced by ComPackExpFloat(), and pack().

unsigned ComPackExpFloat::_manmsk [private]

Definition at line 59 of file ComPackExpFloat.h.

Referenced by ComPackExpFloat(), pack(), and unpack().

unsigned ComPackExpFloat::_mansft [private]

Definition at line 58 of file ComPackExpFloat.h.

Referenced by ComPackExpFloat(), pack(), and unpack().

unsigned ComPackExpFloat::_maxexp [private]

Definition at line 56 of file ComPackExpFloat.h.

Referenced by ComPackExpFloat(), and pack().

unsigned ComPackExpFloat::_maxman [private]

Definition at line 60 of file ComPackExpFloat.h.

Referenced by ComPackExpFloat(), and pack().

double ComPackBase< double >::_maxVal [protected, inherited]

Definition at line 85 of file ComPackBase.h.

Referenced by ComPackExpFloat(), ComPackFlatFloat::ComPackFlatFloat(), and ComPackFlatFloat::testMe().

double ComPackBase< double >::_minVal [protected, inherited]

Definition at line 84 of file ComPackBase.h.

Referenced by ComPackExpFloat(), ComPackFlatFloat::ComPackFlatFloat(), ComPackFlatFloat::pack(), pack(), ComPackFlatFloat::testMe(), and ComPackFlatFloat::unpack().

double ComPackBase< double >::_valRange [protected, inherited]

Definition at line 86 of file ComPackBase.h.

Referenced by ComPackExpFloat(), ComPackFlatFloat::ComPackFlatFloat(), and ComPackFlatFloat::testMe().


Generated on Tue Nov 29 23:18:08 2016 for BOSS_7.0.2 by  doxygen 1.4.7