20#include <xrpl/basics/Number.h>
21#include <xrpl/beast/unit_test.h>
22#include <xrpl/protocol/IOUAmount.h>
23#include <xrpl/protocol/STAmount.h>
39 BEAST_EXPECT(z.mantissa() == 0);
42 BEAST_EXPECT((z + z) == z);
43 BEAST_EXPECT((z - z) == z);
44 BEAST_EXPECT(z == -z);
54 Number x{10'000'000'000'000'000, 32768};
61 Number x{10'000'000'000'000'000, 32767};
62 BEAST_EXPECT((x ==
Number{1'000'000'000'000'000, 32768}));
63 Number z{1'000'000'000'000'000, -32769};
64 BEAST_EXPECT(z ==
Number{});
65 Number y{1'000'000'000'000'001'500, 32000};
66 BEAST_EXPECT((y ==
Number{1'000'000'000'000'002, 32003}));
68 BEAST_EXPECT((m ==
Number{-9'223'372'036'854'776, 3}));
70 BEAST_EXPECT((M ==
Number{9'223'372'036'854'776, 3}));
74 Number q{99'999'999'999'999'999, 32767};
89 {
Number{1'000'000'000'000'000, -15},
90 Number{6'555'555'555'555'555, -29},
91 Number{1'000'000'000'000'066, -15}},
92 {
Number{-1'000'000'000'000'000, -15},
93 Number{-6'555'555'555'555'555, -29},
94 Number{-1'000'000'000'000'066, -15}},
95 {
Number{-1'000'000'000'000'000, -15},
96 Number{6'555'555'555'555'555, -29},
97 Number{-9'999'999'999'999'344, -16}},
98 {
Number{-6'555'555'555'555'555, -29},
99 Number{1'000'000'000'000'000, -15},
100 Number{9'999'999'999'999'344, -16}},
102 {
Number{5'555'555'555'555'555, -32768},
103 Number{-5'555'555'555'555'554, -32768},
105 {
Number{-9'999'999'999'999'999, -31},
106 Number{1'000'000'000'000'000, -15},
107 Number{9'999'999'999'999'990, -16}}};
108 for (
auto const& [x, y, z] : c)
109 BEAST_EXPECT(x + y == z);
113 Number{9'999'999'999'999'999, 32768} +
114 Number{5'000'000'000'000'000, 32767};
120 BEAST_EXPECT(caught);
129 {
Number{1'000'000'000'000'000, -15},
130 Number{6'555'555'555'555'555, -29},
131 Number{9'999'999'999'999'344, -16}},
132 {
Number{6'555'555'555'555'555, -29},
133 Number{1'000'000'000'000'000, -15},
134 Number{-9'999'999'999'999'344, -16}},
135 {
Number{1'000'000'000'000'000, -15},
136 Number{1'000'000'000'000'000, -15},
138 {
Number{1'000'000'000'000'000, -15},
139 Number{1'000'000'000'000'001, -15},
140 Number{-1'000'000'000'000'000, -30}},
141 {
Number{1'000'000'000'000'001, -15},
142 Number{1'000'000'000'000'000, -15},
143 Number{1'000'000'000'000'000, -30}}};
144 for (
auto const& [x, y, z] : c)
145 BEAST_EXPECT(x - y == z);
157 {
Number{1414213562373095, -15},
158 Number{1414213562373095, -15},
159 Number{2000000000000000, -15}},
160 {
Number{-1414213562373095, -15},
161 Number{1414213562373095, -15},
162 Number{-2000000000000000, -15}},
163 {
Number{-1414213562373095, -15},
164 Number{-1414213562373095, -15},
165 Number{2000000000000000, -15}},
166 {
Number{3214285714285706, -15},
167 Number{3111111111111119, -15},
168 Number{1000000000000000, -14}},
169 {
Number{1000000000000000, -32768},
170 Number{1000000000000000, -32768},
172 for (
auto const& [x, y, z] : c)
173 BEAST_EXPECT(x * y == z);
179 {
Number{1414213562373095, -15},
180 Number{1414213562373095, -15},
181 Number{1999999999999999, -15}},
182 {
Number{-1414213562373095, -15},
183 Number{1414213562373095, -15},
184 Number{-1999999999999999, -15}},
185 {
Number{-1414213562373095, -15},
186 Number{-1414213562373095, -15},
187 Number{1999999999999999, -15}},
188 {
Number{3214285714285706, -15},
189 Number{3111111111111119, -15},
190 Number{9999999999999999, -15}},
191 {
Number{1000000000000000, -32768},
192 Number{1000000000000000, -32768},
194 for (
auto const& [x, y, z] : c)
195 BEAST_EXPECT(x * y == z);
201 {
Number{1414213562373095, -15},
202 Number{1414213562373095, -15},
203 Number{1999999999999999, -15}},
204 {
Number{-1414213562373095, -15},
205 Number{1414213562373095, -15},
206 Number{-2000000000000000, -15}},
207 {
Number{-1414213562373095, -15},
208 Number{-1414213562373095, -15},
209 Number{1999999999999999, -15}},
210 {
Number{3214285714285706, -15},
211 Number{3111111111111119, -15},
212 Number{9999999999999999, -15}},
213 {
Number{1000000000000000, -32768},
214 Number{1000000000000000, -32768},
216 for (
auto const& [x, y, z] : c)
217 BEAST_EXPECT(x * y == z);
223 {
Number{1414213562373095, -15},
224 Number{1414213562373095, -15},
225 Number{2000000000000000, -15}},
226 {
Number{-1414213562373095, -15},
227 Number{1414213562373095, -15},
228 Number{-1999999999999999, -15}},
229 {
Number{-1414213562373095, -15},
230 Number{-1414213562373095, -15},
231 Number{2000000000000000, -15}},
232 {
Number{3214285714285706, -15},
233 Number{3111111111111119, -15},
234 Number{1000000000000000, -14}},
235 {
Number{1000000000000000, -32768},
236 Number{1000000000000000, -32768},
238 for (
auto const& [x, y, z] : c)
239 BEAST_EXPECT(x * y == z);
244 Number{9'999'999'999'999'999, 32768} *
245 Number{5'000'000'000'000'000, 32767};
251 BEAST_EXPECT(caught);
266 {
Number{1414213562373095, -10},
267 Number{1414213562373095, -10},
269 {
Number{9'999'999'999'999'999},
270 Number{1'000'000'000'000'000},
271 Number{9'999'999'999'999'999, -15}},
274 for (
auto const& [x, y, z] : c)
275 BEAST_EXPECT(x / y == z);
284 {
Number{1414213562373095, -10},
285 Number{1414213562373095, -10},
287 {
Number{9'999'999'999'999'999},
288 Number{1'000'000'000'000'000},
289 Number{9'999'999'999'999'999, -15}},
292 for (
auto const& [x, y, z] : c)
293 BEAST_EXPECT(x / y == z);
302 {
Number{1414213562373095, -10},
303 Number{1414213562373095, -10},
305 {
Number{9'999'999'999'999'999},
306 Number{1'000'000'000'000'000},
307 Number{9'999'999'999'999'999, -15}},
310 for (
auto const& [x, y, z] : c)
311 BEAST_EXPECT(x / y == z);
320 {
Number{1414213562373095, -10},
321 Number{1414213562373095, -10},
323 {
Number{9'999'999'999'999'999},
324 Number{1'000'000'000'000'000},
325 Number{9'999'999'999'999'999, -15}},
328 for (
auto const& [x, y, z] : c)
329 BEAST_EXPECT(x / y == z);
340 BEAST_EXPECT(caught);
358 for (
auto const& [x, y, z] : c)
359 BEAST_EXPECT((
root(x, y) == z));
369 BEAST_EXPECT(caught);
379 BEAST_EXPECT(caught);
394 for (
auto const& [x, y, z] : c)
395 BEAST_EXPECT((
power(x, y) == z));
410 for (
auto const& [x, n, d, z] : c)
411 BEAST_EXPECT((
power(x, n, d) == z));
421 BEAST_EXPECT(caught);
431 BEAST_EXPECT(caught);
441 BEAST_EXPECT(caught);
451 BEAST_EXPECT((y ==
Number{5, 6}));
453 BEAST_EXPECT(x == z);
460 BEAST_EXPECT((y0 ==
Number{0}));
462 BEAST_EXPECT(x0 == z0);
465 BEAST_EXPECT(n0 ==
Number{0});
467 BEAST_EXPECT(xrp1 == xrp0);
488 {
Number{9'999'999'999'999'999, 0}, 9'999'999'999'999'999},
489 {
Number{9'999'999'999'999'999, 1}, 99'999'999'999'999'990},
490 {
Number{9'999'999'999'999'999, 2}, 999'999'999'999'999'900},
491 {
Number{-9'999'999'999'999'999, 2}, -999'999'999'999'999'900},
506 for (
auto const& [x, y] : c)
509 BEAST_EXPECT(j == y);
526 {
Number{9'999'999'999'999'999, 0}, 9'999'999'999'999'999},
527 {
Number{9'999'999'999'999'999, 1}, 99'999'999'999'999'990},
528 {
Number{9'999'999'999'999'999, 2}, 999'999'999'999'999'900},
529 {
Number{-9'999'999'999'999'999, 2}, -999'999'999'999'999'900},
544 for (
auto const& [x, y] : c)
547 BEAST_EXPECT(j == y);
564 {
Number{9'999'999'999'999'999, 0}, 9'999'999'999'999'999},
565 {
Number{9'999'999'999'999'999, 1}, 99'999'999'999'999'990},
566 {
Number{9'999'999'999'999'999, 2}, 999'999'999'999'999'900},
567 {
Number{-9'999'999'999'999'999, 2}, -999'999'999'999'999'900},
582 for (
auto const& [x, y] : c)
585 BEAST_EXPECT(j == y);
602 {
Number{9'999'999'999'999'999, 0}, 9'999'999'999'999'999},
603 {
Number{9'999'999'999'999'999, 1}, 99'999'999'999'999'990},
604 {
Number{9'999'999'999'999'999, 2}, 999'999'999'999'999'900},
605 {
Number{-9'999'999'999'999'999, 2}, -999'999'999'999'999'900},
620 for (
auto const& [x, y] : c)
623 BEAST_EXPECT(j == y);
635 BEAST_EXPECT(caught);
692 BEAST_EXPECT(x == y);
693 BEAST_EXPECT(x++ == y);
694 BEAST_EXPECT(x ==
Number{101});
695 BEAST_EXPECT(x-- ==
Number{101});
696 BEAST_EXPECT(x == y);
704 Number const n{7'518'783'80596, -5};
706 auto res2 =
STAmount{issue, n.mantissa(), n.exponent()};
707 BEAST_EXPECT(res2 ==
STAmount{7518784});
710 res2 =
STAmount{issue, n.mantissa(), n.exponent()};
711 BEAST_EXPECT(res2 ==
STAmount{7518783});
714 res2 =
STAmount{issue, n.mantissa(), n.exponent()};
715 BEAST_EXPECT(res2 ==
STAmount{7518783});
718 res2 =
STAmount{issue, n.mantissa(), n.exponent()};
719 BEAST_EXPECT(res2 ==
STAmount{7518784});
testcase_t testcase
Memberspace for declaring test cases.
Floating point representation of amounts with high dynamic range.
A currency issued by an account.
RAII class to set and restore the Number switchover.
void run() override
Runs the suite.
constexpr int exponent() const noexcept
static rounding_mode setround(rounding_mode mode)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Number power(Number const &f, unsigned n)
std::string to_string(base_uint< Bits, Tag > const &a)
Number root(Number f, unsigned d)
constexpr Number squelch(Number const &x, Number const &limit) noexcept