177 using namespace boost::multiprecision;
180 Throw<std::runtime_error>(
"division by zero");
185 static auto const powerTable = [] {
189 for (
int i = 0; i < 30; ++i)
199 static auto log10Floor = [](uint128_t
const& v) {
212 static auto log10Ceil = [](uint128_t
const& v) {
220 static auto const fl64 =
223 bool const neg = amt.
mantissa() < 0;
224 uint128_t
const den128(den);
227 uint128_t
const mul =
230 auto low = mul / den128;
231 uint128_t rem(mul - low * den128);
243 auto const roomToGrow = fl64 - log10Ceil(low);
246 exponent -= roomToGrow;
247 low *= powerTable[roomToGrow];
248 rem *= powerTable[roomToGrow];
250 auto const addRem = rem / den128;
252 rem = rem - addRem * den128;
259 bool hasRem = bool(rem);
260 auto const mustShrink = log10Ceil(low) - fl64;
263 uint128_t
const sav(low);
264 exponent += mustShrink;
265 low /= powerTable[mustShrink];
267 hasRem = bool(sav - low * powerTable[mustShrink]);