mirror of
https://github.com/XRPLF/rippled.git
synced 2026-08-21 22:30:57 +00:00
Merge branch 'ripple/wasmi' into ripple/wasmi-host-functions
This commit is contained in:
@@ -66,17 +66,20 @@ public:
|
||||
|
||||
test(
|
||||
Number{std::numeric_limits<std::int64_t>::min()},
|
||||
scale == MantissaRange::small ? Number{-9'223'372'036'854'776, 3}
|
||||
: Number{true, 9'223'372'036'854'775'808ULL, 0, Number::normalized{}},
|
||||
scale == MantissaRange::small
|
||||
? Number{-9'223'372'036'854'776, 3}
|
||||
: Number{true, 9'223'372'036'854'775'808ULL, 0, Number::normalized{}},
|
||||
__LINE__);
|
||||
test(
|
||||
Number{std::numeric_limits<std::int64_t>::min() + 1},
|
||||
scale == MantissaRange::small ? Number{-9'223'372'036'854'776, 3} : Number{-9'223'372'036'854'775'807},
|
||||
scale == MantissaRange::small ? Number{-9'223'372'036'854'776, 3}
|
||||
: Number{-9'223'372'036'854'775'807},
|
||||
__LINE__);
|
||||
test(
|
||||
Number{std::numeric_limits<std::int64_t>::max()},
|
||||
Number{
|
||||
scale == MantissaRange::small ? 9'223'372'036'854'776 : std::numeric_limits<std::int64_t>::max(),
|
||||
scale == MantissaRange::small ? 9'223'372'036'854'776
|
||||
: std::numeric_limits<std::int64_t>::max(),
|
||||
18 - Number::mantissaLog()},
|
||||
__LINE__);
|
||||
caught = false;
|
||||
@@ -114,7 +117,9 @@ public:
|
||||
Number{9'999'999'999'999'344, -16}},
|
||||
{Number{}, Number{5}, Number{5}},
|
||||
{Number{5}, Number{}, Number{5}},
|
||||
{Number{5'555'555'555'555'555, -32768}, Number{-5'555'555'555'555'554, -32768}, Number{0}},
|
||||
{Number{5'555'555'555'555'555, -32768},
|
||||
Number{-5'555'555'555'555'554, -32768},
|
||||
Number{0}},
|
||||
{Number{-9'999'999'999'999'999, -31},
|
||||
Number{1'000'000'000'000'000, -15},
|
||||
Number{9'999'999'999'999'990, -16}}});
|
||||
@@ -137,7 +142,9 @@ public:
|
||||
Number{false, 9'999'999'999'999'344'444ULL, -19, Number::normalized{}}},
|
||||
{Number{}, Number{5}, Number{5}},
|
||||
{Number{5}, Number{}, Number{5}},
|
||||
{Number{5'555'555'555'555'555'000, -32768}, Number{-5'555'555'555'555'554'000, -32768}, Number{0}},
|
||||
{Number{5'555'555'555'555'555'000, -32768},
|
||||
Number{-5'555'555'555'555'554'000, -32768},
|
||||
Number{0}},
|
||||
{Number{-9'999'999'999'999'999, -31},
|
||||
Number{1'000'000'000'000'000, -15},
|
||||
Number{9'999'999'999'999'990, -16}},
|
||||
@@ -155,7 +162,9 @@ public:
|
||||
Number{1'000'000'000'000'000'000, -18},
|
||||
Number{false, 9'999'999'999'999'999'344ULL, -19, Number::normalized{}}},
|
||||
{Number{}, Number{5}, Number{5}},
|
||||
{Number{5'555'555'555'555'555'555, -32768}, Number{-5'555'555'555'555'555'554, -32768}, Number{0}},
|
||||
{Number{5'555'555'555'555'555'555, -32768},
|
||||
Number{-5'555'555'555'555'555'554, -32768},
|
||||
Number{0}},
|
||||
{Number{true, 9'999'999'999'999'999'999ULL, -37, Number::normalized{}},
|
||||
Number{1'000'000'000'000'000'000, -18},
|
||||
Number{false, 9'999'999'999'999'999'990ULL, -19, Number::normalized{}}},
|
||||
@@ -254,7 +263,9 @@ public:
|
||||
{Number{6'555'555'555'555'555'555, -32},
|
||||
Number{1'000'000'000'000'000'000, -18},
|
||||
Number{true, 9'999'999'999'999'344'444ULL, -19, Number::normalized{}}},
|
||||
{Number{1'000'000'000'000'000'000, -18}, Number{1'000'000'000'000'000'000, -18}, Number{0}},
|
||||
{Number{1'000'000'000'000'000'000, -18},
|
||||
Number{1'000'000'000'000'000'000, -18},
|
||||
Number{0}},
|
||||
{Number{1'000'000'000'000'000'000, -18},
|
||||
Number{1'000'000'000'000'000'001, -18},
|
||||
Number{-1'000'000'000'000'000'000, -36}},
|
||||
@@ -265,7 +276,9 @@ public:
|
||||
{Number{false, Number::maxRep + 1, 0, Number::normalized{}},
|
||||
Number{1, 0},
|
||||
Number{Number::maxRep / 10 + 1, 1}},
|
||||
{Number{false, Number::maxRep + 1, 0, Number::normalized{}}, Number{3, 0}, Number{Number::maxRep}},
|
||||
{Number{false, Number::maxRep + 1, 0, Number::normalized{}},
|
||||
Number{3, 0},
|
||||
Number{Number::maxRep}},
|
||||
{power(2, 63), Number{3, 0}, Number{Number::maxRep}},
|
||||
});
|
||||
auto test = [this](auto const& c) {
|
||||
@@ -311,30 +324,50 @@ public:
|
||||
{
|
||||
auto const cSmall = std::to_array<Case>({
|
||||
{Number{7}, Number{8}, Number{56}},
|
||||
{Number{1414213562373095, -15}, Number{1414213562373095, -15}, Number{2000000000000000, -15}},
|
||||
{Number{-1414213562373095, -15}, Number{1414213562373095, -15}, Number{-2000000000000000, -15}},
|
||||
{Number{-1414213562373095, -15}, Number{-1414213562373095, -15}, Number{2000000000000000, -15}},
|
||||
{Number{3214285714285706, -15}, Number{3111111111111119, -15}, Number{1000000000000000, -14}},
|
||||
{Number{1414213562373095, -15},
|
||||
Number{1414213562373095, -15},
|
||||
Number{2000000000000000, -15}},
|
||||
{Number{-1414213562373095, -15},
|
||||
Number{1414213562373095, -15},
|
||||
Number{-2000000000000000, -15}},
|
||||
{Number{-1414213562373095, -15},
|
||||
Number{-1414213562373095, -15},
|
||||
Number{2000000000000000, -15}},
|
||||
{Number{3214285714285706, -15},
|
||||
Number{3111111111111119, -15},
|
||||
Number{1000000000000000, -14}},
|
||||
{Number{1000000000000000, -32768}, Number{1000000000000000, -32768}, Number{0}},
|
||||
// Maximum mantissa range
|
||||
{Number{9'999'999'999'999'999, 0}, Number{9'999'999'999'999'999, 0}, Number{9'999'999'999'999'998, 16}},
|
||||
{Number{9'999'999'999'999'999, 0},
|
||||
Number{9'999'999'999'999'999, 0},
|
||||
Number{9'999'999'999'999'998, 16}},
|
||||
});
|
||||
auto const cLarge = std::to_array<Case>({
|
||||
// Note that items with extremely large mantissas need to be
|
||||
// calculated, because otherwise they overflow uint64. Items
|
||||
// from C with larger mantissa
|
||||
{Number{7}, Number{8}, Number{56}},
|
||||
{Number{1414213562373095, -15}, Number{1414213562373095, -15}, Number{1999999999999999862, -18}},
|
||||
{Number{-1414213562373095, -15}, Number{1414213562373095, -15}, Number{-1999999999999999862, -18}},
|
||||
{Number{-1414213562373095, -15}, Number{-1414213562373095, -15}, Number{1999999999999999862, -18}},
|
||||
{Number{1414213562373095, -15},
|
||||
Number{1414213562373095, -15},
|
||||
Number{1999999999999999862, -18}},
|
||||
{Number{-1414213562373095, -15},
|
||||
Number{1414213562373095, -15},
|
||||
Number{-1999999999999999862, -18}},
|
||||
{Number{-1414213562373095, -15},
|
||||
Number{-1414213562373095, -15},
|
||||
Number{1999999999999999862, -18}},
|
||||
{Number{3214285714285706, -15},
|
||||
Number{3111111111111119, -15},
|
||||
Number{false, 9'999'999'999'999'999'579ULL, -18, Number::normalized{}}},
|
||||
{Number{1000000000000000000, -32768}, Number{1000000000000000000, -32768}, Number{0}},
|
||||
{Number{1000000000000000000, -32768},
|
||||
Number{1000000000000000000, -32768},
|
||||
Number{0}},
|
||||
// Items from cSmall expanded for the larger mantissa,
|
||||
// except duplicates. Sadly, it looks like sqrt(2)^2 != 2
|
||||
// with higher precision
|
||||
{Number{1414213562373095049, -18}, Number{1414213562373095049, -18}, Number{2000000000000000001, -18}},
|
||||
{Number{1414213562373095049, -18},
|
||||
Number{1414213562373095049, -18},
|
||||
Number{2000000000000000001, -18}},
|
||||
{Number{-1414213562373095048, -18},
|
||||
Number{1414213562373095048, -18},
|
||||
Number{-1999999999999999998, -18}},
|
||||
@@ -347,7 +380,9 @@ public:
|
||||
Number{false, maxMantissa, 0, Number::normalized{}},
|
||||
Number{1, 38}},
|
||||
// Maximum int64 range
|
||||
{Number{Number::maxRep, 0}, Number{Number::maxRep, 0}, Number{85'070'591'730'234'615'85, 19}},
|
||||
{Number{Number::maxRep, 0},
|
||||
Number{Number::maxRep, 0},
|
||||
Number{85'070'591'730'234'615'85, 19}},
|
||||
});
|
||||
tests(cSmall, cLarge);
|
||||
}
|
||||
@@ -356,10 +391,18 @@ public:
|
||||
{
|
||||
auto const cSmall = std::to_array<Case>(
|
||||
{{Number{7}, Number{8}, Number{56}},
|
||||
{Number{1414213562373095, -15}, Number{1414213562373095, -15}, Number{1999999999999999, -15}},
|
||||
{Number{-1414213562373095, -15}, Number{1414213562373095, -15}, Number{-1999999999999999, -15}},
|
||||
{Number{-1414213562373095, -15}, Number{-1414213562373095, -15}, Number{1999999999999999, -15}},
|
||||
{Number{3214285714285706, -15}, Number{3111111111111119, -15}, Number{9999999999999999, -15}},
|
||||
{Number{1414213562373095, -15},
|
||||
Number{1414213562373095, -15},
|
||||
Number{1999999999999999, -15}},
|
||||
{Number{-1414213562373095, -15},
|
||||
Number{1414213562373095, -15},
|
||||
Number{-1999999999999999, -15}},
|
||||
{Number{-1414213562373095, -15},
|
||||
Number{-1414213562373095, -15},
|
||||
Number{1999999999999999, -15}},
|
||||
{Number{3214285714285706, -15},
|
||||
Number{3111111111111119, -15},
|
||||
Number{9999999999999999, -15}},
|
||||
{Number{1000000000000000, -32768}, Number{1000000000000000, -32768}, Number{0}}});
|
||||
auto const cLarge = std::to_array<Case>(
|
||||
// Note that items with extremely large mantissas need to be
|
||||
@@ -367,24 +410,36 @@ public:
|
||||
// from C with larger mantissa
|
||||
{
|
||||
{Number{7}, Number{8}, Number{56}},
|
||||
{Number{1414213562373095, -15}, Number{1414213562373095, -15}, Number{1999999999999999861, -18}},
|
||||
{Number{-1414213562373095, -15}, Number{1414213562373095, -15}, Number{-1999999999999999861, -18}},
|
||||
{Number{-1414213562373095, -15}, Number{-1414213562373095, -15}, Number{1999999999999999861, -18}},
|
||||
{Number{1414213562373095, -15},
|
||||
Number{1414213562373095, -15},
|
||||
Number{1999999999999999861, -18}},
|
||||
{Number{-1414213562373095, -15},
|
||||
Number{1414213562373095, -15},
|
||||
Number{-1999999999999999861, -18}},
|
||||
{Number{-1414213562373095, -15},
|
||||
Number{-1414213562373095, -15},
|
||||
Number{1999999999999999861, -18}},
|
||||
{Number{3214285714285706, -15},
|
||||
Number{3111111111111119, -15},
|
||||
Number{false, 9999999999999999579ULL, -18, Number::normalized{}}},
|
||||
{Number{1000000000000000000, -32768}, Number{1000000000000000000, -32768}, Number{0}},
|
||||
{Number{1000000000000000000, -32768},
|
||||
Number{1000000000000000000, -32768},
|
||||
Number{0}},
|
||||
// Items from cSmall expanded for the larger mantissa,
|
||||
// except duplicates. Sadly, it looks like sqrt(2)^2 != 2
|
||||
// with higher precision
|
||||
{Number{1414213562373095049, -18}, Number{1414213562373095049, -18}, Number{2, 0}},
|
||||
{Number{1414213562373095049, -18},
|
||||
Number{1414213562373095049, -18},
|
||||
Number{2, 0}},
|
||||
{Number{-1414213562373095048, -18},
|
||||
Number{1414213562373095048, -18},
|
||||
Number{-1999999999999999997, -18}},
|
||||
{Number{-1414213562373095048, -18},
|
||||
Number{-1414213562373095049, -18},
|
||||
Number{1999999999999999999, -18}},
|
||||
{Number{3214285714285714278, -18}, Number{3111111111111111119, -18}, Number{10, 0}},
|
||||
{Number{3214285714285714278, -18},
|
||||
Number{3111111111111111119, -18},
|
||||
Number{10, 0}},
|
||||
// Maximum mantissa range - rounds down to maxMantissa/10e1
|
||||
// 99'999'999'999'999'999'800'000'000'000'000'000'100
|
||||
{Number{false, maxMantissa, 0, Number::normalized{}},
|
||||
@@ -392,7 +447,9 @@ public:
|
||||
Number{false, maxMantissa / 10 - 1, 20, Number::normalized{}}},
|
||||
// Maximum int64 range
|
||||
// 85'070'591'730'234'615'847'396'907'784'232'501'249
|
||||
{Number{Number::maxRep, 0}, Number{Number::maxRep, 0}, Number{85'070'591'730'234'615'84, 19}},
|
||||
{Number{Number::maxRep, 0},
|
||||
Number{Number::maxRep, 0},
|
||||
Number{85'070'591'730'234'615'84, 19}},
|
||||
});
|
||||
tests(cSmall, cLarge);
|
||||
}
|
||||
@@ -401,10 +458,18 @@ public:
|
||||
{
|
||||
auto const cSmall = std::to_array<Case>(
|
||||
{{Number{7}, Number{8}, Number{56}},
|
||||
{Number{1414213562373095, -15}, Number{1414213562373095, -15}, Number{1999999999999999, -15}},
|
||||
{Number{-1414213562373095, -15}, Number{1414213562373095, -15}, Number{-2000000000000000, -15}},
|
||||
{Number{-1414213562373095, -15}, Number{-1414213562373095, -15}, Number{1999999999999999, -15}},
|
||||
{Number{3214285714285706, -15}, Number{3111111111111119, -15}, Number{9999999999999999, -15}},
|
||||
{Number{1414213562373095, -15},
|
||||
Number{1414213562373095, -15},
|
||||
Number{1999999999999999, -15}},
|
||||
{Number{-1414213562373095, -15},
|
||||
Number{1414213562373095, -15},
|
||||
Number{-2000000000000000, -15}},
|
||||
{Number{-1414213562373095, -15},
|
||||
Number{-1414213562373095, -15},
|
||||
Number{1999999999999999, -15}},
|
||||
{Number{3214285714285706, -15},
|
||||
Number{3111111111111119, -15},
|
||||
Number{9999999999999999, -15}},
|
||||
{Number{1000000000000000, -32768}, Number{1000000000000000, -32768}, Number{0}}});
|
||||
auto const cLarge = std::to_array<Case>(
|
||||
// Note that items with extremely large mantissas need to be
|
||||
@@ -412,24 +477,36 @@ public:
|
||||
// from C with larger mantissa
|
||||
{
|
||||
{Number{7}, Number{8}, Number{56}},
|
||||
{Number{1414213562373095, -15}, Number{1414213562373095, -15}, Number{1999999999999999861, -18}},
|
||||
{Number{-1414213562373095, -15}, Number{1414213562373095, -15}, Number{-1999999999999999862, -18}},
|
||||
{Number{-1414213562373095, -15}, Number{-1414213562373095, -15}, Number{1999999999999999861, -18}},
|
||||
{Number{1414213562373095, -15},
|
||||
Number{1414213562373095, -15},
|
||||
Number{1999999999999999861, -18}},
|
||||
{Number{-1414213562373095, -15},
|
||||
Number{1414213562373095, -15},
|
||||
Number{-1999999999999999862, -18}},
|
||||
{Number{-1414213562373095, -15},
|
||||
Number{-1414213562373095, -15},
|
||||
Number{1999999999999999861, -18}},
|
||||
{Number{3214285714285706, -15},
|
||||
Number{3111111111111119, -15},
|
||||
Number{false, 9'999'999'999'999'999'579ULL, -18, Number::normalized{}}},
|
||||
{Number{1000000000000000000, -32768}, Number{1000000000000000000, -32768}, Number{0}},
|
||||
{Number{1000000000000000000, -32768},
|
||||
Number{1000000000000000000, -32768},
|
||||
Number{0}},
|
||||
// Items from cSmall expanded for the larger mantissa,
|
||||
// except duplicates. Sadly, it looks like sqrt(2)^2 != 2
|
||||
// with higher precision
|
||||
{Number{1414213562373095049, -18}, Number{1414213562373095049, -18}, Number{2, 0}},
|
||||
{Number{1414213562373095049, -18},
|
||||
Number{1414213562373095049, -18},
|
||||
Number{2, 0}},
|
||||
{Number{-1414213562373095048, -18},
|
||||
Number{1414213562373095048, -18},
|
||||
Number{-1999999999999999998, -18}},
|
||||
{Number{-1414213562373095048, -18},
|
||||
Number{-1414213562373095049, -18},
|
||||
Number{1999999999999999999, -18}},
|
||||
{Number{3214285714285714278, -18}, Number{3111111111111111119, -18}, Number{10, 0}},
|
||||
{Number{3214285714285714278, -18},
|
||||
Number{3111111111111111119, -18},
|
||||
Number{10, 0}},
|
||||
// Maximum mantissa range - rounds down to maxMantissa/10e1
|
||||
// 99'999'999'999'999'999'800'000'000'000'000'000'100
|
||||
{Number{false, maxMantissa, 0, Number::normalized{}},
|
||||
@@ -437,7 +514,9 @@ public:
|
||||
Number{false, maxMantissa / 10 - 1, 20, Number::normalized{}}},
|
||||
// Maximum int64 range
|
||||
// 85'070'591'730'234'615'847'396'907'784'232'501'249
|
||||
{Number{Number::maxRep, 0}, Number{Number::maxRep, 0}, Number{85'070'591'730'234'615'84, 19}},
|
||||
{Number{Number::maxRep, 0},
|
||||
Number{Number::maxRep, 0},
|
||||
Number{85'070'591'730'234'615'84, 19}},
|
||||
});
|
||||
tests(cSmall, cLarge);
|
||||
}
|
||||
@@ -446,10 +525,18 @@ public:
|
||||
{
|
||||
auto const cSmall = std::to_array<Case>(
|
||||
{{Number{7}, Number{8}, Number{56}},
|
||||
{Number{1414213562373095, -15}, Number{1414213562373095, -15}, Number{2000000000000000, -15}},
|
||||
{Number{-1414213562373095, -15}, Number{1414213562373095, -15}, Number{-1999999999999999, -15}},
|
||||
{Number{-1414213562373095, -15}, Number{-1414213562373095, -15}, Number{2000000000000000, -15}},
|
||||
{Number{3214285714285706, -15}, Number{3111111111111119, -15}, Number{1000000000000000, -14}},
|
||||
{Number{1414213562373095, -15},
|
||||
Number{1414213562373095, -15},
|
||||
Number{2000000000000000, -15}},
|
||||
{Number{-1414213562373095, -15},
|
||||
Number{1414213562373095, -15},
|
||||
Number{-1999999999999999, -15}},
|
||||
{Number{-1414213562373095, -15},
|
||||
Number{-1414213562373095, -15},
|
||||
Number{2000000000000000, -15}},
|
||||
{Number{3214285714285706, -15},
|
||||
Number{3111111111111119, -15},
|
||||
Number{1000000000000000, -14}},
|
||||
{Number{1000000000000000, -32768}, Number{1000000000000000, -32768}, Number{0}}});
|
||||
auto const cLarge = std::to_array<Case>(
|
||||
// Note that items with extremely large mantissas need to be
|
||||
@@ -457,11 +544,21 @@ public:
|
||||
// from C with larger mantissa
|
||||
{
|
||||
{Number{7}, Number{8}, Number{56}},
|
||||
{Number{1414213562373095, -15}, Number{1414213562373095, -15}, Number{1999999999999999862, -18}},
|
||||
{Number{-1414213562373095, -15}, Number{1414213562373095, -15}, Number{-1999999999999999861, -18}},
|
||||
{Number{-1414213562373095, -15}, Number{-1414213562373095, -15}, Number{1999999999999999862, -18}},
|
||||
{Number{3214285714285706, -15}, Number{3111111111111119, -15}, Number{999999999999999958, -17}},
|
||||
{Number{1000000000000000000, -32768}, Number{1000000000000000000, -32768}, Number{0}},
|
||||
{Number{1414213562373095, -15},
|
||||
Number{1414213562373095, -15},
|
||||
Number{1999999999999999862, -18}},
|
||||
{Number{-1414213562373095, -15},
|
||||
Number{1414213562373095, -15},
|
||||
Number{-1999999999999999861, -18}},
|
||||
{Number{-1414213562373095, -15},
|
||||
Number{-1414213562373095, -15},
|
||||
Number{1999999999999999862, -18}},
|
||||
{Number{3214285714285706, -15},
|
||||
Number{3111111111111119, -15},
|
||||
Number{999999999999999958, -17}},
|
||||
{Number{1000000000000000000, -32768},
|
||||
Number{1000000000000000000, -32768},
|
||||
Number{0}},
|
||||
// Items from cSmall expanded for the larger mantissa,
|
||||
// except duplicates. Sadly, it looks like sqrt(2)^2 != 2
|
||||
// with higher precision
|
||||
@@ -471,7 +568,9 @@ public:
|
||||
{Number{-1414213562373095048, -18},
|
||||
Number{1414213562373095048, -18},
|
||||
Number{-1999999999999999997, -18}},
|
||||
{Number{-1414213562373095048, -18}, Number{-1414213562373095049, -18}, Number{2, 0}},
|
||||
{Number{-1414213562373095048, -18},
|
||||
Number{-1414213562373095049, -18},
|
||||
Number{2, 0}},
|
||||
{Number{3214285714285714278, -18},
|
||||
Number{3111111111111111119, -18},
|
||||
Number{1000000000000000001, -17}},
|
||||
@@ -482,7 +581,9 @@ public:
|
||||
Number{1, 38}},
|
||||
// Maximum int64 range
|
||||
// 85'070'591'730'234'615'847'396'907'784'232'501'249
|
||||
{Number{Number::maxRep, 0}, Number{Number::maxRep, 0}, Number{85'070'591'730'234'615'85, 19}},
|
||||
{Number{Number::maxRep, 0},
|
||||
Number{Number::maxRep, 0},
|
||||
Number{85'070'591'730'234'615'85, 19}},
|
||||
});
|
||||
tests(cSmall, cLarge);
|
||||
}
|
||||
@@ -533,7 +634,9 @@ public:
|
||||
{Number{1}, Number{-10}, Number{-1, -1}},
|
||||
{Number{0}, Number{100}, Number{0}},
|
||||
{Number{1414213562373095, -10}, Number{1414213562373095, -10}, Number{1}},
|
||||
{Number{9'999'999'999'999'999}, Number{1'000'000'000'000'000}, Number{9'999'999'999'999'999, -15}},
|
||||
{Number{9'999'999'999'999'999},
|
||||
Number{1'000'000'000'000'000},
|
||||
Number{9'999'999'999'999'999, -15}},
|
||||
{Number{2}, Number{3}, Number{6'666'666'666'666'667, -16}},
|
||||
{Number{-2}, Number{3}, Number{-6'666'666'666'666'667, -16}},
|
||||
{Number{1}, Number{7}, Number{1'428'571'428'571'428, -16}}});
|
||||
@@ -546,7 +649,9 @@ public:
|
||||
{Number{1}, Number{-10}, Number{-1, -1}},
|
||||
{Number{0}, Number{100}, Number{0}},
|
||||
{Number{1414213562373095, -10}, Number{1414213562373095, -10}, Number{1}},
|
||||
{Number{9'999'999'999'999'999}, Number{1'000'000'000'000'000}, Number{9'999'999'999'999'999, -15}},
|
||||
{Number{9'999'999'999'999'999},
|
||||
Number{1'000'000'000'000'000},
|
||||
Number{9'999'999'999'999'999, -15}},
|
||||
{Number{2}, Number{3}, Number{6'666'666'666'666'666'667, -19}},
|
||||
{Number{-2}, Number{3}, Number{-6'666'666'666'666'666'667, -19}},
|
||||
{Number{1}, Number{7}, Number{1'428'571'428'571'428'571, -19}},
|
||||
@@ -567,7 +672,9 @@ public:
|
||||
{Number{1}, Number{-10}, Number{-1, -1}},
|
||||
{Number{0}, Number{100}, Number{0}},
|
||||
{Number{1414213562373095, -10}, Number{1414213562373095, -10}, Number{1}},
|
||||
{Number{9'999'999'999'999'999}, Number{1'000'000'000'000'000}, Number{9'999'999'999'999'999, -15}},
|
||||
{Number{9'999'999'999'999'999},
|
||||
Number{1'000'000'000'000'000},
|
||||
Number{9'999'999'999'999'999, -15}},
|
||||
{Number{2}, Number{3}, Number{6'666'666'666'666'666, -16}},
|
||||
{Number{-2}, Number{3}, Number{-6'666'666'666'666'666, -16}},
|
||||
{Number{1}, Number{7}, Number{1'428'571'428'571'428, -16}}});
|
||||
@@ -580,7 +687,9 @@ public:
|
||||
{Number{1}, Number{-10}, Number{-1, -1}},
|
||||
{Number{0}, Number{100}, Number{0}},
|
||||
{Number{1414213562373095, -10}, Number{1414213562373095, -10}, Number{1}},
|
||||
{Number{9'999'999'999'999'999}, Number{1'000'000'000'000'000}, Number{9'999'999'999'999'999, -15}},
|
||||
{Number{9'999'999'999'999'999},
|
||||
Number{1'000'000'000'000'000},
|
||||
Number{9'999'999'999'999'999, -15}},
|
||||
{Number{2}, Number{3}, Number{6'666'666'666'666'666'666, -19}},
|
||||
{Number{-2}, Number{3}, Number{-6'666'666'666'666'666'666, -19}},
|
||||
{Number{1}, Number{7}, Number{1'428'571'428'571'428'571, -19}},
|
||||
@@ -601,7 +710,9 @@ public:
|
||||
{Number{1}, Number{-10}, Number{-1, -1}},
|
||||
{Number{0}, Number{100}, Number{0}},
|
||||
{Number{1414213562373095, -10}, Number{1414213562373095, -10}, Number{1}},
|
||||
{Number{9'999'999'999'999'999}, Number{1'000'000'000'000'000}, Number{9'999'999'999'999'999, -15}},
|
||||
{Number{9'999'999'999'999'999},
|
||||
Number{1'000'000'000'000'000},
|
||||
Number{9'999'999'999'999'999, -15}},
|
||||
{Number{2}, Number{3}, Number{6'666'666'666'666'666, -16}},
|
||||
{Number{-2}, Number{3}, Number{-6'666'666'666'666'667, -16}},
|
||||
{Number{1}, Number{7}, Number{1'428'571'428'571'428, -16}}});
|
||||
@@ -614,7 +725,9 @@ public:
|
||||
{Number{1}, Number{-10}, Number{-1, -1}},
|
||||
{Number{0}, Number{100}, Number{0}},
|
||||
{Number{1414213562373095, -10}, Number{1414213562373095, -10}, Number{1}},
|
||||
{Number{9'999'999'999'999'999}, Number{1'000'000'000'000'000}, Number{9'999'999'999'999'999, -15}},
|
||||
{Number{9'999'999'999'999'999},
|
||||
Number{1'000'000'000'000'000},
|
||||
Number{9'999'999'999'999'999, -15}},
|
||||
{Number{2}, Number{3}, Number{6'666'666'666'666'666'666, -19}},
|
||||
{Number{-2}, Number{3}, Number{-6'666'666'666'666'666'667, -19}},
|
||||
{Number{1}, Number{7}, Number{1'428'571'428'571'428'571, -19}},
|
||||
@@ -635,7 +748,9 @@ public:
|
||||
{Number{1}, Number{-10}, Number{-1, -1}},
|
||||
{Number{0}, Number{100}, Number{0}},
|
||||
{Number{1414213562373095, -10}, Number{1414213562373095, -10}, Number{1}},
|
||||
{Number{9'999'999'999'999'999}, Number{1'000'000'000'000'000}, Number{9'999'999'999'999'999, -15}},
|
||||
{Number{9'999'999'999'999'999},
|
||||
Number{1'000'000'000'000'000},
|
||||
Number{9'999'999'999'999'999, -15}},
|
||||
{Number{2}, Number{3}, Number{6'666'666'666'666'667, -16}},
|
||||
{Number{-2}, Number{3}, Number{-6'666'666'666'666'666, -16}},
|
||||
{Number{1}, Number{7}, Number{1'428'571'428'571'429, -16}}});
|
||||
@@ -648,7 +763,9 @@ public:
|
||||
{Number{1}, Number{-10}, Number{-1, -1}},
|
||||
{Number{0}, Number{100}, Number{0}},
|
||||
{Number{1414213562373095, -10}, Number{1414213562373095, -10}, Number{1}},
|
||||
{Number{9'999'999'999'999'999}, Number{1'000'000'000'000'000}, Number{9'999'999'999'999'999, -15}},
|
||||
{Number{9'999'999'999'999'999},
|
||||
Number{1'000'000'000'000'000},
|
||||
Number{9'999'999'999'999'999, -15}},
|
||||
{Number{2}, Number{3}, Number{6'666'666'666'666'666'667, -19}},
|
||||
{Number{-2}, Number{3}, Number{-6'666'666'666'666'666'666, -19}},
|
||||
{Number{1}, Number{7}, Number{1'428'571'428'571'428'572, -19}},
|
||||
@@ -714,8 +831,12 @@ public:
|
||||
{Number{false, Number::maxMantissa() - 9, 0, Number::normalized{}},
|
||||
2,
|
||||
Number{false, 3'162'277'660'168'379'330, -9, Number::normalized{}}},
|
||||
{Number{Number::maxRep}, 2, Number{false, 3'037'000'499'976049692, -9, Number::normalized{}}},
|
||||
{Number{Number::maxRep}, 4, Number{false, 55'108'98747006743627, -14, Number::normalized{}}},
|
||||
{Number{Number::maxRep},
|
||||
2,
|
||||
Number{false, 3'037'000'499'976049692, -9, Number::normalized{}}},
|
||||
{Number{Number::maxRep},
|
||||
4,
|
||||
Number{false, 55'108'98747006743627, -14, Number::normalized{}}},
|
||||
});
|
||||
test(cSmall);
|
||||
if (Number::getMantissaScale() != MantissaRange::small)
|
||||
@@ -1100,14 +1221,23 @@ public:
|
||||
|
||||
auto const maxMantissa = Number::maxMantissa();
|
||||
BEAST_EXPECT(maxMantissa == 9'999'999'999'999'999);
|
||||
test(Number{false, maxMantissa * 1000 + 999, -3, Number::normalized()}, "9999999999999999");
|
||||
test(Number{true, maxMantissa * 1000 + 999, -3, Number::normalized()}, "-9999999999999999");
|
||||
test(
|
||||
Number{false, maxMantissa * 1000 + 999, -3, Number::normalized()},
|
||||
"9999999999999999");
|
||||
test(
|
||||
Number{true, maxMantissa * 1000 + 999, -3, Number::normalized()},
|
||||
"-9999999999999999");
|
||||
|
||||
test(Number{std::numeric_limits<std::int64_t>::max(), -3}, "9223372036854775");
|
||||
test(-(Number{std::numeric_limits<std::int64_t>::max(), -3}), "-9223372036854775");
|
||||
test(
|
||||
-(Number{std::numeric_limits<std::int64_t>::max(), -3}),
|
||||
"-9223372036854775");
|
||||
|
||||
test(Number{std::numeric_limits<std::int64_t>::min(), 0}, "-9223372036854775e3");
|
||||
test(-(Number{std::numeric_limits<std::int64_t>::min(), 0}), "9223372036854775e3");
|
||||
test(
|
||||
Number{std::numeric_limits<std::int64_t>::min(), 0}, "-9223372036854775e3");
|
||||
test(
|
||||
-(Number{std::numeric_limits<std::int64_t>::min(), 0}),
|
||||
"9223372036854775e3");
|
||||
}
|
||||
break;
|
||||
case MantissaRange::large:
|
||||
@@ -1121,21 +1251,33 @@ public:
|
||||
|
||||
auto const maxMantissa = Number::maxMantissa();
|
||||
BEAST_EXPECT(maxMantissa == 9'999'999'999'999'999'999ULL);
|
||||
test(Number{false, maxMantissa, 0, Number::normalized{}}, "9999999999999999990");
|
||||
test(Number{true, maxMantissa, 0, Number::normalized{}}, "-9999999999999999990");
|
||||
test(
|
||||
Number{false, maxMantissa, 0, Number::normalized{}}, "9999999999999999990");
|
||||
test(
|
||||
Number{true, maxMantissa, 0, Number::normalized{}}, "-9999999999999999990");
|
||||
|
||||
test(Number{std::numeric_limits<std::int64_t>::max(), 0}, "9223372036854775807");
|
||||
test(-(Number{std::numeric_limits<std::int64_t>::max(), 0}), "-9223372036854775807");
|
||||
test(
|
||||
Number{std::numeric_limits<std::int64_t>::max(), 0}, "9223372036854775807");
|
||||
test(
|
||||
-(Number{std::numeric_limits<std::int64_t>::max(), 0}),
|
||||
"-9223372036854775807");
|
||||
|
||||
// Because the absolute value of min is larger than max, it
|
||||
// will be scaled down to fit under max. Since we're
|
||||
// rounding towards zero, the 8 at the end is dropped.
|
||||
test(Number{std::numeric_limits<std::int64_t>::min(), 0}, "-9223372036854775800");
|
||||
test(-(Number{std::numeric_limits<std::int64_t>::min(), 0}), "9223372036854775800");
|
||||
test(
|
||||
Number{std::numeric_limits<std::int64_t>::min(), 0},
|
||||
"-9223372036854775800");
|
||||
test(
|
||||
-(Number{std::numeric_limits<std::int64_t>::min(), 0}),
|
||||
"9223372036854775800");
|
||||
}
|
||||
|
||||
test(Number{std::numeric_limits<std::int64_t>::max(), 0} + 1, "9223372036854775810");
|
||||
test(-(Number{std::numeric_limits<std::int64_t>::max(), 0} + 1), "-9223372036854775810");
|
||||
test(
|
||||
Number{std::numeric_limits<std::int64_t>::max(), 0} + 1, "9223372036854775810");
|
||||
test(
|
||||
-(Number{std::numeric_limits<std::int64_t>::max(), 0} + 1),
|
||||
"-9223372036854775810");
|
||||
break;
|
||||
default:
|
||||
BEAST_EXPECT(false);
|
||||
@@ -1233,39 +1375,87 @@ public:
|
||||
std::map<Number, NumberRoundings> const expected{
|
||||
// Positive numbers
|
||||
{Number{13, -1},
|
||||
{{Number::to_nearest, 1}, {Number::towards_zero, 1}, {Number::downward, 1}, {Number::upward, 2}}},
|
||||
{{Number::to_nearest, 1},
|
||||
{Number::towards_zero, 1},
|
||||
{Number::downward, 1},
|
||||
{Number::upward, 2}}},
|
||||
{Number{23, -1},
|
||||
{{Number::to_nearest, 2}, {Number::towards_zero, 2}, {Number::downward, 2}, {Number::upward, 3}}},
|
||||
{{Number::to_nearest, 2},
|
||||
{Number::towards_zero, 2},
|
||||
{Number::downward, 2},
|
||||
{Number::upward, 3}}},
|
||||
{Number{15, -1},
|
||||
{{Number::to_nearest, 2}, {Number::towards_zero, 1}, {Number::downward, 1}, {Number::upward, 2}}},
|
||||
{{Number::to_nearest, 2},
|
||||
{Number::towards_zero, 1},
|
||||
{Number::downward, 1},
|
||||
{Number::upward, 2}}},
|
||||
{Number{25, -1},
|
||||
{{Number::to_nearest, 2}, {Number::towards_zero, 2}, {Number::downward, 2}, {Number::upward, 3}}},
|
||||
{{Number::to_nearest, 2},
|
||||
{Number::towards_zero, 2},
|
||||
{Number::downward, 2},
|
||||
{Number::upward, 3}}},
|
||||
{Number{152, -2},
|
||||
{{Number::to_nearest, 2}, {Number::towards_zero, 1}, {Number::downward, 1}, {Number::upward, 2}}},
|
||||
{{Number::to_nearest, 2},
|
||||
{Number::towards_zero, 1},
|
||||
{Number::downward, 1},
|
||||
{Number::upward, 2}}},
|
||||
{Number{252, -2},
|
||||
{{Number::to_nearest, 3}, {Number::towards_zero, 2}, {Number::downward, 2}, {Number::upward, 3}}},
|
||||
{{Number::to_nearest, 3},
|
||||
{Number::towards_zero, 2},
|
||||
{Number::downward, 2},
|
||||
{Number::upward, 3}}},
|
||||
{Number{17, -1},
|
||||
{{Number::to_nearest, 2}, {Number::towards_zero, 1}, {Number::downward, 1}, {Number::upward, 2}}},
|
||||
{{Number::to_nearest, 2},
|
||||
{Number::towards_zero, 1},
|
||||
{Number::downward, 1},
|
||||
{Number::upward, 2}}},
|
||||
{Number{27, -1},
|
||||
{{Number::to_nearest, 3}, {Number::towards_zero, 2}, {Number::downward, 2}, {Number::upward, 3}}},
|
||||
{{Number::to_nearest, 3},
|
||||
{Number::towards_zero, 2},
|
||||
{Number::downward, 2},
|
||||
{Number::upward, 3}}},
|
||||
|
||||
// Negative numbers
|
||||
{Number{-13, -1},
|
||||
{{Number::to_nearest, -1}, {Number::towards_zero, -1}, {Number::downward, -2}, {Number::upward, -1}}},
|
||||
{{Number::to_nearest, -1},
|
||||
{Number::towards_zero, -1},
|
||||
{Number::downward, -2},
|
||||
{Number::upward, -1}}},
|
||||
{Number{-23, -1},
|
||||
{{Number::to_nearest, -2}, {Number::towards_zero, -2}, {Number::downward, -3}, {Number::upward, -2}}},
|
||||
{{Number::to_nearest, -2},
|
||||
{Number::towards_zero, -2},
|
||||
{Number::downward, -3},
|
||||
{Number::upward, -2}}},
|
||||
{Number{-15, -1},
|
||||
{{Number::to_nearest, -2}, {Number::towards_zero, -1}, {Number::downward, -2}, {Number::upward, -1}}},
|
||||
{{Number::to_nearest, -2},
|
||||
{Number::towards_zero, -1},
|
||||
{Number::downward, -2},
|
||||
{Number::upward, -1}}},
|
||||
{Number{-25, -1},
|
||||
{{Number::to_nearest, -2}, {Number::towards_zero, -2}, {Number::downward, -3}, {Number::upward, -2}}},
|
||||
{{Number::to_nearest, -2},
|
||||
{Number::towards_zero, -2},
|
||||
{Number::downward, -3},
|
||||
{Number::upward, -2}}},
|
||||
{Number{-152, -2},
|
||||
{{Number::to_nearest, -2}, {Number::towards_zero, -1}, {Number::downward, -2}, {Number::upward, -1}}},
|
||||
{{Number::to_nearest, -2},
|
||||
{Number::towards_zero, -1},
|
||||
{Number::downward, -2},
|
||||
{Number::upward, -1}}},
|
||||
{Number{-252, -2},
|
||||
{{Number::to_nearest, -3}, {Number::towards_zero, -2}, {Number::downward, -3}, {Number::upward, -2}}},
|
||||
{{Number::to_nearest, -3},
|
||||
{Number::towards_zero, -2},
|
||||
{Number::downward, -3},
|
||||
{Number::upward, -2}}},
|
||||
{Number{-17, -1},
|
||||
{{Number::to_nearest, -2}, {Number::towards_zero, -1}, {Number::downward, -2}, {Number::upward, -1}}},
|
||||
{{Number::to_nearest, -2},
|
||||
{Number::towards_zero, -1},
|
||||
{Number::downward, -2},
|
||||
{Number::upward, -1}}},
|
||||
{Number{-27, -1},
|
||||
{{Number::to_nearest, -3}, {Number::towards_zero, -2}, {Number::downward, -3}, {Number::upward, -2}}},
|
||||
{{Number::to_nearest, -3},
|
||||
{Number::towards_zero, -2},
|
||||
{Number::downward, -3},
|
||||
{Number::upward, -2}}},
|
||||
};
|
||||
|
||||
for (auto const& [num, roundings] : expected)
|
||||
@@ -1276,8 +1466,8 @@ public:
|
||||
auto const res = static_cast<std::int64_t>(num);
|
||||
BEAST_EXPECTS(
|
||||
res == val,
|
||||
to_string(num) + " with mode " + std::to_string(mode) + " expected " + std::to_string(val) +
|
||||
" got " + std::to_string(res));
|
||||
to_string(num) + " with mode " + std::to_string(mode) + " expected " +
|
||||
std::to_string(val) + " got " + std::to_string(res));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1330,7 +1520,8 @@ public:
|
||||
BEAST_EXPECT(max.exponent() == 1);
|
||||
// 99'999'999'999'999'999'800'000'000'000'000'000'100 - also 38
|
||||
// digits
|
||||
BEAST_EXPECT((power(max, 2) == Number{false, maxMantissa / 10 - 1, 20, Number::normalized{}}));
|
||||
BEAST_EXPECT(
|
||||
(power(max, 2) == Number{false, maxMantissa / 10 - 1, 20, Number::normalized{}}));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user