196    using namespace boost::multiprecision;
 
  199        Throw<std::runtime_error>(
"division by zero");
 
  204    static auto const powerTable = [] {
 
  208        for (
int i = 0; i < 30; ++i)
 
  218    static auto log10Floor = [](uint128_t 
const& v) {
 
  231    static auto log10Ceil = [](uint128_t 
const& v) {
 
  239    static auto const fl64 =
 
  242    bool const neg = amt.
mantissa() < 0;
 
  243    uint128_t 
const den128(den);
 
  246    uint128_t 
const mul =
 
  249    auto low = mul / den128;
 
  250    uint128_t rem(mul - low * den128);
 
  262        auto const roomToGrow = fl64 - log10Ceil(low);
 
  265            exponent -= roomToGrow;
 
  266            low *= powerTable[roomToGrow];
 
  267            rem *= powerTable[roomToGrow];
 
  269        auto const addRem = rem / den128;
 
  271        rem = rem - addRem * den128;
 
  278    bool hasRem = bool(rem);
 
  279    auto const mustShrink = log10Ceil(low) - fl64;
 
  282        uint128_t 
const sav(low);
 
  283        exponent += mustShrink;
 
  284        low /= powerTable[mustShrink];
 
  286            hasRem = bool(sav - low * powerTable[mustShrink]);