BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
ComPackExpFloat Class Reference

#include <ComPackExpFloat.h>

Inheritance diagram for ComPackExpFloat:

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
 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
 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
Public Member Functions inherited from ComPackBase< double >
 ComPackBase ()
virtual ~ComPackBase ()
virtual const double & getMinVal () const
virtual const double & getMaxVal () const
virtual const double & getRange () const
d_ULong bitRange () const
d_ULong bitMask () const
ComPackBaseoperator= (const ComPackBase &)

Additional Inherited Members

Public Types inherited from ComPackBaseBase
enum  StatusCode {
  TAG_OK , TAG_BAD , TAG_RANGE_ERROR , TAG_VAL_ROUND_DOWN ,
  TAG_VAL_ROUND_UP , TAG_OK , TAG_BAD , TAG_RANGE_ERROR ,
  TAG_VAL_ROUND_DOWN , TAG_VAL_ROUND_UP , 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 , TAG_OK , TAG_BAD , TAG_RANGE_ERROR ,
  TAG_VAL_ROUND_DOWN , TAG_VAL_ROUND_UP , 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 , TAG_OK , TAG_BAD , TAG_RANGE_ERROR ,
  TAG_VAL_ROUND_DOWN , TAG_VAL_ROUND_UP , TAG_OK , TAG_BAD ,
  TAG_RANGE_ERROR , TAG_VAL_ROUND_DOWN , TAG_VAL_ROUND_UP
}
Protected Types inherited from ComPackBase< double >
enum  
enum  
enum  
Protected Attributes inherited from ComPackBase< double >
double _minVal
double _maxVal
double _valRange
d_ULong _bitRange
d_ULong _bitMask

Detailed Description

Constructor & Destructor Documentation

◆ ComPackExpFloat() [1/3]

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

Definition at line 31 of file ComPackExpFloat.cxx.

33 : ComPackBase<double>( start, stop, nbits ), _maxexp( maxexponent ) {
34 if ( _maxexp > 62 )
35 {
36 std::cout << "ErrMsg(fatal) "
37 << "Can't pack exponents larger than 62" << endl;
38 abort();
39 }
40 static double invln2( 1.0 / log( 2.0 ) );
41 long long one( 1 );
42 // compute how many bits used by exponent
43 _mansft = _maxexp > 0 ? (unsigned)( log( double( _maxexp ) ) * invln2 + 1.01 ) : 0;
44 _expmsk = ( 1 << _mansft ) - 1;
45 _maxman = ( 1 << ( _bitRange - _mansft ) );
46 _manmsk = _maxman - 1;
47 double invmaxman = 1.0 / _maxman;
48 long long maxnorm = ( one << ( maxexponent + 1 ) ) - 1;
49 // correct the range if we're centering the bins
50 if ( center )
51 {
52 long long norm = one << maxexponent;
53 double alpha = 1.0 / ( (double)maxnorm * _maxman * 2.0 - ( norm + 1.0 ) );
55 _maxVal += _valRange * norm * alpha;
57 // cout << "alpha = " << alpha << " norm = " << norm << endl;
58 }
59 // finish the calculations
60 _invrange = maxnorm / _valRange;
61 double invmaxnorm = _valRange / maxnorm;
62 double manoff = ( 0.5 * invmaxman + 1.0 ) * invmaxnorm;
63 double valoff = _minVal - invmaxnorm;
64 double manfac = invmaxnorm * invmaxman;
65 // pre-compute some factors and store them in an array
66 _expfac = new double[_maxexp + 1];
67 _expoff = new double[_maxexp + 1];
68 for ( unsigned iexp = 0; iexp <= _maxexp; iexp++ )
69 {
70 double expf = ( one << iexp );
71 _expoff[iexp] = valoff + manoff * expf;
72 _expfac[iexp] = manfac * expf;
73 }
74}
double alpha
const DifNumber one

Referenced by print().

◆ ~ComPackExpFloat() [1/3]

ComPackExpFloat::~ComPackExpFloat ( )
virtual

Definition at line 76 of file ComPackExpFloat.cxx.

76 {
77 delete[] _expfac;
78 delete[] _expoff;
79}

◆ ComPackExpFloat() [2/3]

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

◆ ~ComPackExpFloat() [2/3]

virtual ComPackExpFloat::~ComPackExpFloat ( )
virtual

◆ ComPackExpFloat() [3/3]

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

◆ ~ComPackExpFloat() [3/3]

virtual ComPackExpFloat::~ComPackExpFloat ( )
virtual

Member Function Documentation

◆ pack() [1/3]

ComPackBase< double >::StatusCode ComPackExpFloat::pack ( const double value,
d_ULong & packdata ) const
virtual

Implements ComPackBase< double >.

Definition at line 81 of file ComPackExpFloat.cxx.

82 {
83 static double invln2( 1.0 / log( 2.0 ) );
84 static long long one( 1 );
86 // first, figure out the exponent
87 double renorm = 1.0 + ( value - _minVal ) * _invrange;
88 if ( renorm < 1.0 )
89 {
90 renorm = 1.0;
91 retval = TAG_VAL_ROUND_UP;
92 }
93 unsigned iexp = unsigned( log( renorm ) * invln2 );
94 unsigned iman( 0 );
95 if ( iexp <= _maxexp )
96 {
97 long long expon = one << iexp;
98 iman = (unsigned)( _maxman * ( renorm / expon - 1.0 ) );
99 // deal with floating-point rounding, which could give a 'non-physical' result
100 if ( iman == _maxman )
101 {
102 if ( iexp == _maxexp ) iman = _maxman - 1;
103 else
104 {
105 iman = 0;
106 iexp++;
107 }
108 }
109 }
110 else
111 {
112 iexp = _maxexp;
113 iman = _maxman - 1;
114 retval = TAG_VAL_ROUND_DOWN;
115 }
116 packdata = ( iexp & _expmsk ) | ( iman & _manmsk ) << _mansft;
117 return retval;
118}

◆ pack() [2/3]

virtual StatusCode ComPackExpFloat::pack ( const double ,
d_ULong &  ) const
virtual

Implements ComPackBase< double >.

◆ pack() [3/3]

virtual StatusCode ComPackExpFloat::pack ( const double ,
d_ULong &  ) const
virtual

Implements ComPackBase< double >.

◆ print() [1/3]

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

◆ print() [2/3]

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

◆ print() [3/3]

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

◆ unpack() [1/3]

ComPackBase< double >::StatusCode ComPackExpFloat::unpack ( const d_ULong packdata,
double & value ) const
virtual

Implements ComPackBase< double >.

Definition at line 120 of file ComPackExpFloat.cxx.

121 {
122 size_t iman = ( packdata >> _mansft ) & _manmsk;
123 size_t iexp = packdata & _expmsk;
124 value = _expoff[iexp] + iman * _expfac[iexp];
125 return TAG_OK;
126}

◆ unpack() [2/3]

virtual StatusCode ComPackExpFloat::unpack ( const d_ULong ,
double &  ) const
virtual

Implements ComPackBase< double >.

◆ unpack() [3/3]

virtual StatusCode ComPackExpFloat::unpack ( const d_ULong ,
double &  ) const
virtual

Implements ComPackBase< double >.


The documentation for this class was generated from the following files: