20 #include <ripple/basics/IOUAmount.h>
21 #include <ripple/basics/contract.h>
22 #include <boost/multiprecision/cpp_int.hpp>
34 getStaticSTNumberSwitchover()
36 static LocalValue<bool> r{
true};
44 return *getStaticSTNumberSwitchover();
50 *getStaticSTNumberSwitchover() = v;
81 Throw<std::overflow_error>(
"value overflow");
101 Throw<std::overflow_error>(
"IOUAmount::normalize");
114 Throw<std::overflow_error>(
"value overflow");
121 : mantissa_(other.mantissa()), exponent_(other.exponent())
124 Throw<std::overflow_error>(
"value overflow");
132 if (other == beast::zero)
135 if (*
this == beast::zero)
188 using namespace boost::multiprecision;
191 Throw<std::runtime_error>(
"division by zero");
196 static auto const powerTable = [] {
200 for (
int i = 0; i < 30; ++i)
210 static auto log10Floor = [](uint128_t
const& v) {
223 static auto log10Ceil = [](uint128_t
const& v) {
231 static auto const fl64 =
234 bool const neg = amt.
mantissa() < 0;
235 uint128_t
const den128(den);
238 uint128_t
const mul =
241 auto low = mul / den128;
242 uint128_t rem(mul - low * den128);
254 auto const roomToGrow = fl64 - log10Ceil(low);
257 exponent -= roomToGrow;
258 low *= powerTable[roomToGrow];
259 rem *= powerTable[roomToGrow];
261 auto const addRem = rem / den128;
263 rem = rem - addRem * den128;
270 bool hasRem = bool(rem);
271 auto const mustShrink = log10Ceil(low) - fl64;
274 uint128_t
const sav(low);
275 exponent += mustShrink;
276 low /= powerTable[mustShrink];
278 hasRem = bool(sav - low * powerTable[mustShrink]);