20 #include <ripple/basics/IOUAmount.h>
21 #include <ripple/basics/Number.h>
22 #include <ripple/beast/unit_test.h>
23 #include <ripple/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);
50 testcase(
"test_limits");
54 Number x{10
'000'000
'000'000
'000, 32768};
56 catch (std::overflow_error const&)
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}));
67 Number m{std::numeric_limits<std::int64_t>::min()};
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};
116 catch (std::overflow_error const&)
120 BEAST_EXPECT(caught);
126 testcase("test_sub");
127 using Case = std::tuple<Number, Number, Number>;
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);
151 testcase("test_mul");
152 using Case = std::tuple<Number, Number, Number>;
153 saveNumberRoundMode save{Number::setround(Number::to_nearest)};
156 {Number{7}, Number{8}, Number{56}},
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);
175 Number::setround(Number::towards_zero);
178 {Number{7}, Number{8}, Number{56}},
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);
197 Number::setround(Number::downward);
200 {Number{7}, Number{8}, Number{56}},
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);
219 Number::setround(Number::upward);
222 {Number{7}, Number{8}, Number{56}},
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};
247 catch (std::overflow_error const&)
251 BEAST_EXPECT(caught);
257 testcase("test_div");
258 using Case = std::tuple<Number, Number, Number>;
259 saveNumberRoundMode save{Number::setround(Number::to_nearest)};
262 {Number{1}, Number{2}, Number{5, -1}},
263 {Number{1}, Number{10}, Number{1, -1}},
264 {Number{1}, Number{-10}, Number{-1, -1}},
265 {Number{0}, Number{100}, Number{0}},
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}},
272 {Number{2}, Number{3}, Number{6
'666'666
'666'666
'667, -16}},
273 {Number{-2}, Number{3}, Number{-6'666
'666'666
'666'667, -16}}};
274 for (
auto const& [x, y, z] : c)
275 BEAST_EXPECT(x / y == z);
280 {Number{1}, Number{2}, Number{5, -1}},
281 {Number{1}, Number{10}, Number{1, -1}},
282 {Number{1}, Number{-10}, Number{-1, -1}},
283 {Number{0}, Number{100}, Number{0}},
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}},
290 {Number{2}, Number{3}, Number{6'666
'666'666
'666'666, -16}},
291 {Number{-2}, Number{3}, Number{-6
'666'666
'666'666
'666, -16}}};
292 for (auto const& [x, y, z] : c)
293 BEAST_EXPECT(x / y == z);
295 Number::setround(Number::downward);
298 {Number{1}, Number{2}, Number{5, -1}},
299 {Number{1}, Number{10}, Number{1, -1}},
300 {Number{1}, Number{-10}, Number{-1, -1}},
301 {Number{0}, Number{100}, Number{0}},
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}},
308 {Number{2}, Number{3}, Number{6
'666'666
'666'666
'666, -16}},
309 {Number{-2}, Number{3}, Number{-6'666
'666'666
'666'667, -16}}};
310 for (
auto const& [x, y, z] : c)
311 BEAST_EXPECT(x / y == z);
316 {Number{1}, Number{2}, Number{5, -1}},
317 {Number{1}, Number{10}, Number{1, -1}},
318 {Number{1}, Number{-10}, Number{-1, -1}},
319 {Number{0}, Number{100}, Number{0}},
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}},
326 {Number{2}, Number{3}, Number{6'666
'666'666
'666'667, -16}},
327 {Number{-2}, Number{3}, Number{-6
'666'666
'666'666
'666, -16}}};
328 for (auto const& [x, y, z] : c)
329 BEAST_EXPECT(x / y == z);
334 Number{1000000000000000, -15} / Number{0};
336 catch (std::overflow_error const&)
340 BEAST_EXPECT(caught);
346 testcase("test_root");
347 using Case = std::tuple<Number, unsigned, Number>;
349 {Number{2}, 2, Number{1414213562373095, -15}},
350 {Number{2'000
'000}, 2, Number{1414213562373095, -12}},
351 {Number{2, -30}, 2, Number{1414213562373095, -30}},
352 {Number{-27}, 3, Number{-3}},
353 {Number{1}, 5, Number{1}},
354 {Number{-1}, 0, Number{1}},
355 {Number{5, -1}, 0, Number{0}},
356 {Number{0}, 5, Number{0}},
357 {Number{5625, -4}, 2, Number{75, -2}}};
358 for (auto const& [x, y, z] : c)
359 BEAST_EXPECT((root(x, y) == z));
363 (void)root(Number{-2}, 0);
365 catch (std::overflow_error const&)
369 BEAST_EXPECT(caught);
373 (void)root(Number{-2}, 4);
375 catch (std::overflow_error const&)
379 BEAST_EXPECT(caught);
385 testcase("test_power1");
386 using Case = std::tuple<Number, unsigned, Number>;
388 {Number{64}, 0, Number{1}},
389 {Number{64}, 1, Number{64}},
390 {Number{64}, 2, Number{4096}},
391 {Number{-64}, 2, Number{4096}},
392 {Number{64}, 3, Number{262144}},
393 {Number{-64}, 3, Number{-262144}}};
394 for (auto const& [x, y, z] : c)
395 BEAST_EXPECT((power(x, y) == z));
401 testcase("test_power2");
402 using Case = std::tuple<Number, unsigned, unsigned, Number>;
404 {Number{1}, 3, 7, Number{1}},
405 {Number{-1}, 1, 0, Number{1}},
406 {Number{-1, -1}, 1, 0, Number{0}},
407 {Number{16}, 0, 5, Number{1}},
408 {Number{34}, 3, 3, Number{34}},
409 {Number{4}, 3, 2, Number{8}}};
410 for (auto const& [x, n, d, z] : c)
411 BEAST_EXPECT((power(x, n, d) == z));
415 (void)power(Number{7}, 0, 0);
417 catch (std::overflow_error const&)
421 BEAST_EXPECT(caught);
425 (void)power(Number{7}, 1, 0);
427 catch (std::overflow_error const&)
431 BEAST_EXPECT(caught);
435 (void)power(Number{-1, -1}, 3, 2);
437 catch (std::overflow_error const&)
441 BEAST_EXPECT(caught);
447 testcase("testConversions");
451 BEAST_EXPECT((y == Number{5, 6}));
453 BEAST_EXPECT(x == z);
457 BEAST_EXPECT(XRPAmount{n} == xrp);
460 BEAST_EXPECT((y0 == Number{0}));
462 BEAST_EXPECT(x0 == z0);
465 BEAST_EXPECT(n0 == Number{0});
467 BEAST_EXPECT(xrp1 == xrp0);
473 testcase("test_to_integer");
474 using Case = std::tuple<Number, std::int64_t>;
475 saveNumberRoundMode save{Number::setround(Number::to_nearest)};
487 {Number{1155}, 1155},
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},
499 {Number{-15, -1}, -2},
500 {Number{-14, -1}, -1},
501 {Number{-16, -1}, -2},
502 {Number{-25, -1}, -2},
503 {Number{-6, -1}, -1},
505 {Number{-4, -1}, 0}};
506 for (auto const& [x, y] : c)
508 auto j = static_cast<std::int64_t>(x);
509 BEAST_EXPECT(j == y);
512 auto prev_mode = Number::setround(Number::towards_zero);
513 BEAST_EXPECT(prev_mode == Number::to_nearest);
525 {Number{1155}, 1155},
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},
537 {Number{-15, -1}, -1},
538 {Number{-14, -1}, -1},
539 {Number{-16, -1}, -1},
540 {Number{-25, -1}, -2},
543 {Number{-4, -1}, 0}};
544 for (auto const& [x, y] : c)
546 auto j = static_cast<std::int64_t>(x);
547 BEAST_EXPECT(j == y);
550 prev_mode = Number::setround(Number::downward);
551 BEAST_EXPECT(prev_mode == Number::towards_zero);
563 {Number{1155}, 1155},
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},
575 {Number{-15, -1}, -2},
576 {Number{-14, -1}, -2},
577 {Number{-16, -1}, -2},
578 {Number{-25, -1}, -3},
579 {Number{-6, -1}, -1},
580 {Number{-5, -1}, -1},
581 {Number{-4, -1}, -1}};
582 for (auto const& [x, y] : c)
584 auto j = static_cast<std::int64_t>(x);
585 BEAST_EXPECT(j == y);
588 prev_mode = Number::setround(Number::upward);
589 BEAST_EXPECT(prev_mode == Number::downward);
601 {Number{1155}, 1155},
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},
613 {Number{-15, -1}, -1},
614 {Number{-14, -1}, -1},
615 {Number{-16, -1}, -1},
616 {Number{-25, -1}, -2},
619 {Number{-4, -1}, 0}};
620 for (auto const& [x, y] : c)
622 auto j = static_cast<std::int64_t>(x);
623 BEAST_EXPECT(j == y);
629 (void)static_cast<std::int64_t>(Number{9223372036854776, 3});
631 catch (std::overflow_error const&)
635 BEAST_EXPECT(caught);
641 testcase("test_squelch");
643 BEAST_EXPECT((squelch(Number{2, -6}, limit) == Number{2, -6}));
644 BEAST_EXPECT((squelch(Number{1, -6}, limit) == Number{1, -6}));
645 BEAST_EXPECT((squelch(Number{9, -7}, limit) == Number{0}));
646 BEAST_EXPECT((squelch(Number{-2, -6}, limit) == Number{-2, -6}));
647 BEAST_EXPECT((squelch(Number{-1, -6}, limit) == Number{-1, -6}));
648 BEAST_EXPECT((squelch(Number{-9, -7}, limit) == Number{0}));
654 testcase("testToString");
655 BEAST_EXPECT(to_string(Number(-2, 0)) == "-2");
656 BEAST_EXPECT(to_string(Number(0, 0)) == "0");
657 BEAST_EXPECT(to_string(Number(2, 0)) == "2");
658 BEAST_EXPECT(to_string(Number(25, -3)) == "0.025");
659 BEAST_EXPECT(to_string(Number(-25, -3)) == "-0.025");
660 BEAST_EXPECT(to_string(Number(25, 1)) == "250");
661 BEAST_EXPECT(to_string(Number(-25, 1)) == "-250");
662 BEAST_EXPECT(to_string(Number(2, 20)) == "2000000000000000e5");
663 BEAST_EXPECT(to_string(Number(-2, -20)) == "-2000000000000000e-35");
669 testcase("test_relationals");
670 BEAST_EXPECT(!(Number{100} < Number{10}));
671 BEAST_EXPECT(Number{100} > Number{10});
672 BEAST_EXPECT(Number{100} >= Number{10});
673 BEAST_EXPECT(!(Number{100} <= Number{10}));
679 testcase("test_stream");
681 std::ostringstream os;
683 BEAST_EXPECT(os.str() == to_string(x));
689 testcase("test_inc_dec");
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);
702 NumberSO stNumberSO{true};
704 Number const n{7'518
'783'80596, -5};
706 auto res2 = STAmount{issue, n.mantissa(), n.exponent()};
707 BEAST_EXPECT(res2 == STAmount{7518784});
709 Number::setround(Number::towards_zero);
710 res2 = STAmount{issue, n.mantissa(), n.exponent()};
711 BEAST_EXPECT(res2 == STAmount{7518783});
713 Number::setround(Number::downward);
714 res2 = STAmount{issue, n.mantissa(), n.exponent()};
715 BEAST_EXPECT(res2 == STAmount{7518783});
717 Number::setround(Number::upward);
718 res2 = STAmount{issue, n.mantissa(), n.exponent()};
719 BEAST_EXPECT(res2 == STAmount{7518784});
745 BEAST_DEFINE_TESTSUITE(Number, ripple_basics,
ripple);