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]);