3#include <xrpl/beast/utility/instrumentation.h>
24constexpr std::optional<int>
28 while (value >= 10 && value % 10 == 0)
63 for (; exponent < result.
size() - 1; ++exponent,
power *= 10)
65 result[exponent] =
power;
69 result[exponent] =
power;
71 throw std::logic_error(
"Power of 10 table is not big enough for the uint64_t type");
177 if (exponent < 0 || exponent >=
kPowerOfTen.size())
320 static_assert(
kMaxRep == 9'223'372'036'854'775'807);
342 explicit constexpr Number(
354 [[nodiscard]]
constexpr rep
356 [[nodiscard]] constexpr
int
360 operator+() const noexcept;
362 operator-() const noexcept;
373 operator+=(
Number const& x);
375 operator-=(
Number const& x);
378 operator*=(
Number const& x);
380 operator/=(
Number const& x);
395 operator
rep() const;
397 friend constexpr
bool
400 return x.negative_ == y.negative_ && x.mantissa_ == y.mantissa_ &&
401 x.exponent_ == y.exponent_;
404 friend constexpr bool
410 friend constexpr bool
413 bool const lneg = l.negative_;
414 bool const rneg = r.negative_;
423 if (l.mantissa_ == 0)
424 return r.mantissa_ > 0;
428 if (r.mantissa_ == 0)
432 if (l.exponent_ > r.exponent_)
434 if (l.exponent_ < r.exponent_)
441 return l.mantissa_ > r.mantissa_;
444 return l.mantissa_ < r.mantissa_;
448 [[nodiscard]]
constexpr int
459 friend constexpr
bool
465 friend constexpr bool
471 friend constexpr bool
647 "xrpl::Number::mantissa",
648 "large normalized mantissa has no remainder");
668 "xrpl::Number::exponent",
669 "large normalized mantissa has no remainder");
687 x.negative_ = !x.negative_;
782 return *
this ==
Number{} ||
783 (
range.min <= absM && absM <=
range.max && (absM <=
kMaxRep || absM % 10 == 0) &&
787template <auto MinMantissa, auto MaxMantissa, Integral64 T>
794 auto constexpr kMIN =
static_cast<T
>(MinMantissa);
795 auto constexpr kMAX =
static_cast<T
>(MaxMantissa);
796 static_assert(kMIN > 0);
797 static_assert(kMIN % 10 == 0);
799 static_assert(kMAX % 10 == 9);
800 static_assert((kMAX + 1) / 10 == kMIN);
810 "xrpl::Number::normalizeToRange",
811 "Number is non-negative for unsigned range.");
818 auto const sign = negative ? -1 : 1;
834power(Number
const& f,
unsigned n);
841root(Number f,
unsigned d);
849power(Number
const& f,
unsigned n,
unsigned d);
869 return "largeLegacy";
NumberMantissaScaleGuard(NumberMantissaScaleGuard const &)=delete
MantissaRange::MantissaScale const saved_
~NumberMantissaScaleGuard()
NumberMantissaScaleGuard & operator=(NumberMantissaScaleGuard const &)=delete
NumberMantissaScaleGuard(MantissaRange::MantissaScale scale) noexcept
NumberRoundModeGuard(Number::RoundingMode mode) noexcept
SaveNumberRoundMode saved_
NumberRoundModeGuard & operator=(NumberRoundModeGuard const &)=delete
NumberRoundModeGuard(NumberRoundModeGuard const &)=delete
Number is a floating point type that can represent a wide range of values.
static internalrep minMantissa()
constexpr rep mantissa() const noexcept
Returns the mantissa of the external view of the Number.
std::pair< T, int > normalizeToRange() const
Number truncate() const noexcept
friend std::string to_string(Number const &amount)
friend constexpr bool operator<(Number const &l, Number const &r) noexcept
static constexpr int kMinExponent
static RoundingMode setround(RoundingMode inMode)
constexpr Number operator-() const noexcept
MantissaRange::rep internalrep
static Number max() noexcept
static RoundingMode getround()
static std::reference_wrapper< MantissaRange const > kRange
static constexpr internalrep kMaxRep
constexpr Number operator+() const noexcept
Number shiftExponent(int exponentDelta) const
friend constexpr bool operator!=(Number const &x, Number const &y) noexcept
static MantissaRange::MantissaScale getMantissaScale()
Returns which mantissa scale is currently in use for normalization.
friend constexpr bool operator>=(Number const &x, Number const &y) noexcept
static internalrep externalToInternal(rep mantissa)
static internalrep maxMantissa()
static constexpr int kMaxExponent
bool isnormal() const noexcept
constexpr int exponent() const noexcept
Returns the exponent of the external view of the Number.
friend void doNormalize(bool &negative, T &mantissa, int &exponent, MantissaRange::rep const &minMantissa, MantissaRange::rep const &maxMantissa, MantissaRange::CuspRoundingFix cuspRoundingFixEnabled, bool dropped)
friend std::ostream & operator<<(std::ostream &os, Number const &x)
static void normalize(bool &negative, T &mantissa, int &exponent, internalrep const &minMantissa, internalrep const &maxMantissa, MantissaRange::CuspRoundingFix cuspRoundingFixEnabled)
Normalize Number components to an arbitrary range.
friend Number root2(Number f)
constexpr int signum() const noexcept
Return the sign of the amount.
Number & operator-=(Number const &x)
static Number min() noexcept
void normalize(MantissaRange const &range)
constexpr Number()=default
static void setMantissaScale(MantissaRange::MantissaScale scale)
Changes which mantissa scale is used for normalization.
static Number lowest() noexcept
friend constexpr bool operator<=(Number const &x, Number const &y) noexcept
friend Number root(Number f, unsigned d)
SaveNumberRoundMode(SaveNumberRoundMode const &)=delete
SaveNumberRoundMode & operator=(SaveNumberRoundMode const &)=delete
SaveNumberRoundMode(Number::RoundingMode mode) noexcept
Number::RoundingMode mode_
constexpr std::size_t kInt64Digits
Builds a table of the powers of 10.
consteval std::array< std::uint64_t, kInt64Digits > buildPowersOfTen()
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
static constexpr Number kNumZero
constexpr BaseUInt< Bits, Tag > operator+(BaseUInt< Bits, Tag > const &a, BaseUInt< Bits, Tag > const &b)
Number operator-(Number const &x, Number const &y)
ClosedInterval< T > range(T low, T high)
Create a closed range interval.
Number operator/(Number const &x, Number const &y)
int scale(Number const &number, Asset const &asset)
Get the scale of a Number for a given asset.
Number root(Number f, unsigned d)
Number power(Number const &f, unsigned n)
Number operator*(Number const &x, Number const &y)
std::string to_string(BaseUInt< Bits, Tag > const &a)
constexpr std::array< std::uint64_t, detail::kInt64Digits > kPowerOfTen
constexpr std::optional< int > logTen(T value)
constexpr bool isPowerOfTen(T value)
constexpr Number abs(Number x) noexcept
Buffer sign(PublicKey const &pk, SecretKey const &sk, Slice const &message)
Generate a signature for a message.
constexpr Number squelch(Number const &x, Number const &limit) noexcept
MantissaRange defines a range for the mantissa of a normalized Number.
MantissaScale const scale
static MantissaRange const & getMantissaRange(MantissaScale scale)
static constexpr int getExponent(MantissaScale scale)
static std::set< MantissaScale > const & getAllScales()
CuspRoundingFix const cuspRoundingFixEnabled
static std::unordered_map< MantissaScale, MantissaRange > const & getRanges()
constexpr MantissaRange(MantissaScale sc)
static constexpr rep getMin(MantissaScale scale, int exponent)
static constexpr CuspRoundingFix isCuspFixEnabled(MantissaScale scale)