#include <ComPackExpFloat.h>
Inheritance diagram for ComPackExpFloat:
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 &) | |
ComPackExpFloat & | operator= (const ComPackExpFloat &) |
Private Attributes | |
unsigned | _maxexp |
unsigned | _expmsk |
unsigned | _mansft |
unsigned | _manmsk |
unsigned | _maxman |
double | _invrange |
double * | _expfac |
double * | _expoff |
Definition at line 35 of file ComPackExpFloat.h.
enum ComPackBaseBase::StatusCode [inherited] |
Definition at line 35 of file ComPackBaseBase.h.
00035 { 00036 TAG_OK, TAG_BAD, TAG_RANGE_ERROR, TAG_VAL_ROUND_DOWN, TAG_VAL_ROUND_UP 00037 };
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] |
ComPackExpFloat::ComPackExpFloat | ( | const ComPackExpFloat & | ) | [private] |
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 }
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] |
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] |
unsigned ComPackExpFloat::_maxman [private] |
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().