32 double stop,
bool center )
33 :
ComPackBase<double>( start, stop, nbits ), _maxexp( maxexponent ) {
36 std::cout <<
"ErrMsg(fatal) "
37 <<
"Can't pack exponents larger than 62" << endl;
40 static double invln2( 1.0 / log( 2.0 ) );
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;
52 long long norm =
one << maxexponent;
53 double alpha = 1.0 / ( (double)maxnorm * _maxman * 2.0 - ( norm + 1.0 ) );
62 double manoff = ( 0.5 * invmaxman + 1.0 ) * invmaxnorm;
63 double valoff =
_minVal - invmaxnorm;
64 double manfac = invmaxnorm * invmaxman;
66 _expfac =
new double[_maxexp + 1];
67 _expoff =
new double[_maxexp + 1];
68 for (
unsigned iexp = 0; iexp <= _maxexp; iexp++ )
70 double expf = (
one << iexp );
71 _expoff[iexp] = valoff + manoff * expf;
72 _expfac[iexp] = manfac * expf;