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>
40 BEAST_EXPECT(z.mantissa() == 0);
43 BEAST_EXPECT((z + z) == z);
44 BEAST_EXPECT((z - z) == z);
45 BEAST_EXPECT(z == -z);
55 Number x{10'000'000'000'000'000, 32768};
62 Number x{10'000'000'000'000'000, 32767};
63 BEAST_EXPECT((x ==
Number{1'000'000'000'000'000, 32768}));
64 Number z{1'000'000'000'000'000, -32769};
65 BEAST_EXPECT(z ==
Number{});
66 Number y{1'000'000'000'000'001'500, 32000};
67 BEAST_EXPECT((y ==
Number{1'000'000'000'000'002, 32003}));
69 BEAST_EXPECT((m ==
Number{-9'223'372'036'854'776, 3}));
71 BEAST_EXPECT((M ==
Number{9'223'372'036'854'776, 3}));
75 Number q{99'999'999'999'999'999, 32767};
90 {
Number{1'000'000'000'000'000, -15},
91 Number{6'555'555'555'555'555, -29},
92 Number{1'000'000'000'000'066, -15}},
93 {
Number{-1'000'000'000'000'000, -15},
94 Number{-6'555'555'555'555'555, -29},
95 Number{-1'000'000'000'000'066, -15}},
96 {
Number{-1'000'000'000'000'000, -15},
97 Number{6'555'555'555'555'555, -29},
98 Number{-9'999'999'999'999'344, -16}},
99 {
Number{-6'555'555'555'555'555, -29},
100 Number{1'000'000'000'000'000, -15},
101 Number{9'999'999'999'999'344, -16}},
103 {
Number{5'555'555'555'555'555, -32768},
104 Number{-5'555'555'555'555'554, -32768},
106 {
Number{-9'999'999'999'999'999, -31},
107 Number{1'000'000'000'000'000, -15},
108 Number{9'999'999'999'999'990, -16}}};
109 for (
auto const& [x, y, z] : c)
110 BEAST_EXPECT(x + y == z);
114 Number{9'999'999'999'999'999, 32768} +
115 Number{5'000'000'000'000'000, 32767};
121 BEAST_EXPECT(caught);
130 {
Number{1'000'000'000'000'000, -15},
131 Number{6'555'555'555'555'555, -29},
132 Number{9'999'999'999'999'344, -16}},
133 {
Number{6'555'555'555'555'555, -29},
134 Number{1'000'000'000'000'000, -15},
135 Number{-9'999'999'999'999'344, -16}},
136 {
Number{1'000'000'000'000'000, -15},
137 Number{1'000'000'000'000'000, -15},
139 {
Number{1'000'000'000'000'000, -15},
140 Number{1'000'000'000'000'001, -15},
141 Number{-1'000'000'000'000'000, -30}},
142 {
Number{1'000'000'000'000'001, -15},
143 Number{1'000'000'000'000'000, -15},
144 Number{1'000'000'000'000'000, -30}}};
145 for (
auto const& [x, y, z] : c)
146 BEAST_EXPECT(x - y == z);
158 {
Number{1414213562373095, -15},
159 Number{1414213562373095, -15},
160 Number{2000000000000000, -15}},
161 {
Number{-1414213562373095, -15},
162 Number{1414213562373095, -15},
163 Number{-2000000000000000, -15}},
164 {
Number{-1414213562373095, -15},
165 Number{-1414213562373095, -15},
166 Number{2000000000000000, -15}},
167 {
Number{3214285714285706, -15},
168 Number{3111111111111119, -15},
169 Number{1000000000000000, -14}},
170 {
Number{1000000000000000, -32768},
171 Number{1000000000000000, -32768},
173 for (
auto const& [x, y, z] : c)
174 BEAST_EXPECT(x * y == z);
180 {
Number{1414213562373095, -15},
181 Number{1414213562373095, -15},
182 Number{1999999999999999, -15}},
183 {
Number{-1414213562373095, -15},
184 Number{1414213562373095, -15},
185 Number{-1999999999999999, -15}},
186 {
Number{-1414213562373095, -15},
187 Number{-1414213562373095, -15},
188 Number{1999999999999999, -15}},
189 {
Number{3214285714285706, -15},
190 Number{3111111111111119, -15},
191 Number{9999999999999999, -15}},
192 {
Number{1000000000000000, -32768},
193 Number{1000000000000000, -32768},
195 for (
auto const& [x, y, z] : c)
196 BEAST_EXPECT(x * y == z);
202 {
Number{1414213562373095, -15},
203 Number{1414213562373095, -15},
204 Number{1999999999999999, -15}},
205 {
Number{-1414213562373095, -15},
206 Number{1414213562373095, -15},
207 Number{-2000000000000000, -15}},
208 {
Number{-1414213562373095, -15},
209 Number{-1414213562373095, -15},
210 Number{1999999999999999, -15}},
211 {
Number{3214285714285706, -15},
212 Number{3111111111111119, -15},
213 Number{9999999999999999, -15}},
214 {
Number{1000000000000000, -32768},
215 Number{1000000000000000, -32768},
217 for (
auto const& [x, y, z] : c)
218 BEAST_EXPECT(x * y == z);
224 {
Number{1414213562373095, -15},
225 Number{1414213562373095, -15},
226 Number{2000000000000000, -15}},
227 {
Number{-1414213562373095, -15},
228 Number{1414213562373095, -15},
229 Number{-1999999999999999, -15}},
230 {
Number{-1414213562373095, -15},
231 Number{-1414213562373095, -15},
232 Number{2000000000000000, -15}},
233 {
Number{3214285714285706, -15},
234 Number{3111111111111119, -15},
235 Number{1000000000000000, -14}},
236 {
Number{1000000000000000, -32768},
237 Number{1000000000000000, -32768},
239 for (
auto const& [x, y, z] : c)
240 BEAST_EXPECT(x * y == z);
245 Number{9'999'999'999'999'999, 32768} *
246 Number{5'000'000'000'000'000, 32767};
252 BEAST_EXPECT(caught);
267 {
Number{1414213562373095, -10},
268 Number{1414213562373095, -10},
270 {
Number{9'999'999'999'999'999},
271 Number{1'000'000'000'000'000},
272 Number{9'999'999'999'999'999, -15}},
275 for (
auto const& [x, y, z] : c)
276 BEAST_EXPECT(x / y == z);
285 {
Number{1414213562373095, -10},
286 Number{1414213562373095, -10},
288 {
Number{9'999'999'999'999'999},
289 Number{1'000'000'000'000'000},
290 Number{9'999'999'999'999'999, -15}},
293 for (
auto const& [x, y, z] : c)
294 BEAST_EXPECT(x / y == z);
303 {
Number{1414213562373095, -10},
304 Number{1414213562373095, -10},
306 {
Number{9'999'999'999'999'999},
307 Number{1'000'000'000'000'000},
308 Number{9'999'999'999'999'999, -15}},
311 for (
auto const& [x, y, z] : c)
312 BEAST_EXPECT(x / y == z);
321 {
Number{1414213562373095, -10},
322 Number{1414213562373095, -10},
324 {
Number{9'999'999'999'999'999},
325 Number{1'000'000'000'000'000},
326 Number{9'999'999'999'999'999, -15}},
329 for (
auto const& [x, y, z] : c)
330 BEAST_EXPECT(x / y == z);
341 BEAST_EXPECT(caught);
359 for (
auto const& [x, y, z] : c)
360 BEAST_EXPECT((
root(x, y) == z));
370 BEAST_EXPECT(caught);
380 BEAST_EXPECT(caught);
395 for (
auto const& [x, y, z] : c)
396 BEAST_EXPECT((
power(x, y) == z));
411 for (
auto const& [x, n, d, z] : c)
412 BEAST_EXPECT((
power(x, n, d) == z));
422 BEAST_EXPECT(caught);
432 BEAST_EXPECT(caught);
442 BEAST_EXPECT(caught);
452 BEAST_EXPECT((y ==
Number{5, 6}));
454 BEAST_EXPECT(x == z);
461 BEAST_EXPECT((y0 ==
Number{0}));
463 BEAST_EXPECT(x0 == z0);
466 BEAST_EXPECT(n0 ==
Number{0});
468 BEAST_EXPECT(xrp1 == xrp0);
489 {
Number{9'999'999'999'999'999, 0}, 9'999'999'999'999'999},
490 {
Number{9'999'999'999'999'999, 1}, 99'999'999'999'999'990},
491 {
Number{9'999'999'999'999'999, 2}, 999'999'999'999'999'900},
492 {
Number{-9'999'999'999'999'999, 2}, -999'999'999'999'999'900},
507 for (
auto const& [x, y] : c)
510 BEAST_EXPECT(j == y);
527 {
Number{9'999'999'999'999'999, 0}, 9'999'999'999'999'999},
528 {
Number{9'999'999'999'999'999, 1}, 99'999'999'999'999'990},
529 {
Number{9'999'999'999'999'999, 2}, 999'999'999'999'999'900},
530 {
Number{-9'999'999'999'999'999, 2}, -999'999'999'999'999'900},
545 for (
auto const& [x, y] : c)
548 BEAST_EXPECT(j == y);
565 {
Number{9'999'999'999'999'999, 0}, 9'999'999'999'999'999},
566 {
Number{9'999'999'999'999'999, 1}, 99'999'999'999'999'990},
567 {
Number{9'999'999'999'999'999, 2}, 999'999'999'999'999'900},
568 {
Number{-9'999'999'999'999'999, 2}, -999'999'999'999'999'900},
583 for (
auto const& [x, y] : c)
586 BEAST_EXPECT(j == y);
603 {
Number{9'999'999'999'999'999, 0}, 9'999'999'999'999'999},
604 {
Number{9'999'999'999'999'999, 1}, 99'999'999'999'999'990},
605 {
Number{9'999'999'999'999'999, 2}, 999'999'999'999'999'900},
606 {
Number{-9'999'999'999'999'999, 2}, -999'999'999'999'999'900},
621 for (
auto const& [x, y] : c)
624 BEAST_EXPECT(j == y);
636 BEAST_EXPECT(caught);
693 BEAST_EXPECT(x == y);
694 BEAST_EXPECT(x++ == y);
695 BEAST_EXPECT(x ==
Number{101});
696 BEAST_EXPECT(x-- ==
Number{101});
697 BEAST_EXPECT(x == y);
705 Number const n{7'518'783'80596, -5};
707 auto res2 =
STAmount{issue, n.mantissa(), n.exponent()};
708 BEAST_EXPECT(res2 ==
STAmount{7518784});
711 res2 =
STAmount{issue, n.mantissa(), n.exponent()};
712 BEAST_EXPECT(res2 ==
STAmount{7518783});
715 res2 =
STAmount{issue, n.mantissa(), n.exponent()};
716 BEAST_EXPECT(res2 ==
STAmount{7518783});
719 res2 =
STAmount{issue, n.mantissa(), n.exponent()};
720 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