inline BigFloat SafeMin( const BigFloat& alpha ) { // TODO: Decide how to only recompute this when the precision changes const BigFloat one = BigFloat(1,alpha.Precision()); const BigFloat eps = Epsilon(alpha); const BigFloat minVal = Min(alpha); const BigFloat invMax = one/Max(alpha); return ( invMax>minVal ? invMax*(one+eps) : minVal ); }
inline BigFloat Epsilon<BigFloat>( const BigFloat& alpha ) { // NOTE: This 'precision' is the number of bits in the mantissa auto p = alpha.Precision(); // epsilon = b^{-(p-1)} / 2 = 2^{-p} BigFloat one(1,p); return one >> p; }
inline Int NumMantissaBits<BigFloat>( const BigFloat& alpha ) { return alpha.Precision(); }
inline BigFloat Infinity<BigFloat>( const BigFloat& alpha ) { BigFloat inf(0,alpha.Precision()); mpfr_set_inf( inf.Pointer(), 1 ); return inf; }
inline BigFloat Min<BigFloat>( const BigFloat& alpha ) { BigFloat one(1,alpha.Precision()); return one << (MinExponent<BigFloat>()-1); }
inline BigFloat Max<BigFloat>( const BigFloat& alpha ) { BigFloat one(1,alpha.Precision()); return (one-Epsilon(one)) << MaxExponent<BigFloat>(); }