Lose the value returns for various reasons of inequality.

This commit is contained in:
John Ralls 2014-11-29 13:24:03 -08:00
parent a99335104f
commit ab94094523
2 changed files with 61 additions and 28 deletions

View File

@ -104,23 +104,23 @@ int
QofInt128::cmp (const QofInt128& b) const noexcept
{
if (m_flags & (overflow | NaN))
return -9;
return -1;
if (b.isOverflow () || b.isNan ())
return 9;
return 1;
if (m_flags & neg)
{
if (!b.isNeg()) return -1;
if (m_hi > b.m_hi) return -3;
if (m_hi < b.m_hi) return 3;
if (m_lo > b.m_lo) return -2;
if (m_lo < b.m_lo) return 2;
if (m_hi > b.m_hi) return -1;
if (m_hi < b.m_hi) return 1;
if (m_lo > b.m_lo) return -1;
if (m_lo < b.m_lo) return 1;
return 0;
}
if (b.isNeg()) return 1;
if (m_hi < b.m_hi) return -5;
if (m_hi > b.m_hi) return 5;
if (m_lo < b.m_lo) return -4;
if (m_lo > b.m_lo) return 4;
if (m_hi < b.m_hi) return -1;
if (m_hi > b.m_hi) return 1;
if (m_lo < b.m_lo) return -1;
if (m_lo > b.m_lo) return 1;
return 0;
}

View File

@ -218,37 +218,37 @@ TEST(qofint128_functions, test_compare)
QofInt128 overflowed (INT64_C(0), INT64_C(0), QofInt128::overflow);
QofInt128 not_a_number (INT64_C(0), INT64_C(0), QofInt128::NaN);
EXPECT_EQ (-9, overflowed.cmp (big));
EXPECT_EQ (-9, not_a_number.cmp (big));
EXPECT_EQ (9, big.cmp (overflowed));
EXPECT_EQ (9, big.cmp (not_a_number));
EXPECT_EQ (-1, overflowed.cmp (big));
EXPECT_EQ (-1, not_a_number.cmp (big));
EXPECT_EQ (1, big.cmp (overflowed));
EXPECT_EQ (1, big.cmp (not_a_number));
EXPECT_EQ (-1, neg_big.cmp(big));
EXPECT_EQ (-1, neg_big.cmp(small));
EXPECT_EQ (-1, neg_small.cmp(big));
EXPECT_EQ (-2, neg_big.cmp(neg_small));
EXPECT_EQ (2, neg_small.cmp(neg_big));
EXPECT_EQ (-1, neg_big.cmp(neg_small));
EXPECT_EQ (1, neg_small.cmp(neg_big));
EXPECT_EQ (-4, small.cmp(big));
EXPECT_EQ (4, big.cmp(small));
EXPECT_EQ (-1, small.cmp(big));
EXPECT_EQ (1, big.cmp(small));
EXPECT_EQ (1, small.cmp(neg_big));
EXPECT_EQ (1, big.cmp(neg_small));
EXPECT_EQ (-5, big.cmp(a_little_smaller));
EXPECT_EQ (-1, big.cmp(a_little_smaller));
EXPECT_EQ (1, big.cmp(neg_a_little_smaller));
EXPECT_EQ (-4, really_big.cmp(slightly_bigger));
EXPECT_EQ (5, really_big.cmp(not_as_big));
EXPECT_EQ (-5, big.cmp(really_big));
EXPECT_EQ (-1, really_big.cmp(slightly_bigger));
EXPECT_EQ (1, really_big.cmp(not_as_big));
EXPECT_EQ (-1, big.cmp(really_big));
EXPECT_EQ (-1, neg_really_big.cmp(big));
EXPECT_EQ (-1, neg_really_big.cmp(not_as_big));
EXPECT_EQ (-1, neg_really_big.cmp(slightly_bigger));
EXPECT_EQ (-3, neg_really_big.cmp(neg_not_as_big));
EXPECT_EQ (-3, neg_really_big.cmp(neg_a_little_smaller));
EXPECT_EQ (2, neg_really_big.cmp(neg_slightly_bigger));
EXPECT_EQ (3, neg_not_as_big.cmp(neg_really_big));
EXPECT_EQ (-2, neg_not_as_big.cmp(neg_a_little_smaller));
EXPECT_EQ (-3, neg_really_big.cmp(neg_a_little_smaller));
EXPECT_EQ (-1, neg_really_big.cmp(neg_not_as_big));
EXPECT_EQ (-1, neg_really_big.cmp(neg_a_little_smaller));
EXPECT_EQ (1, neg_really_big.cmp(neg_slightly_bigger));
EXPECT_EQ (1, neg_not_as_big.cmp(neg_really_big));
EXPECT_EQ (-1, neg_not_as_big.cmp(neg_a_little_smaller));
EXPECT_EQ (-1, neg_really_big.cmp(neg_a_little_smaller));
EXPECT_EQ (0, neg_really_big.cmp(QofInt128(barg, sarg, QofInt128::neg)));
EXPECT_EQ (0, really_big.cmp(QofInt128(barg, sarg)));
@ -303,8 +303,12 @@ TEST(qofint128_functions, add_and_subtract)
QofInt128 big (sarg, barg);
QofInt128 bigger (static_cast<uint64_t>(barg), uarg);
QofInt128 biggest (uarg, static_cast<uint64_t>(barg));
QofInt128 nsmall (UINT64_C(0), uarg, QofInt128::neg);
EXPECT_EQ (QofInt128(INT64_C(2), INT64_C(499)), small += smaller);
EXPECT_EQ (QofInt128(INT64_C(2), INT64_C(499), QofInt128::neg),
nsmall -= smaller);
EXPECT_EQ (QofInt128(uarg), small -= smaller);
EXPECT_EQ (QofInt128(static_cast<uint64_t>(barg + sarg/2), UINT64_MAX),
bigger += big);
@ -352,6 +356,8 @@ TEST(qofint128_functions, divide)
QofInt128 small (uarg);
QofInt128 big (sarg, barg);
QofInt128 bigger (static_cast<uint64_t>(barg), uarg);
QofInt128 nsmall = -small;
QofInt128 nbig = -bigger;
EXPECT_EQ (QofInt128(INT64_C(0)), zero /= smallest);
EXPECT_EQ (QofInt128(INT64_C(0)), zero %= smallest);
@ -364,6 +370,18 @@ TEST(qofint128_functions, divide)
EXPECT_EQ (two, q);
EXPECT_EQ (QofInt128(INT64_C(3810195028972355394)), r);
small.div (-smaller, q, r);
EXPECT_EQ (-two, q);
EXPECT_EQ (QofInt128(INT64_C(3810195028972355394)), r);
nsmall.div (smaller, q, r);
EXPECT_EQ (-two, q);
EXPECT_EQ (QofInt128(INT64_C(3810195028972355394)), r);
nsmall.div (-smaller, q, r);
EXPECT_EQ (two, q);
EXPECT_EQ (QofInt128(INT64_C(3810195028972355394)), r);
bigger.div (bigger, q, r);
EXPECT_EQ (one, q);
EXPECT_EQ (zero, r);
@ -381,6 +399,21 @@ TEST(qofint128_functions, divide)
EXPECT_EQ (QofInt128(UINT64_C(534327326303355007),
UINT64_C(3810195028972355394)), r);
bigger.div (-big, q, r);
EXPECT_EQ (-two, q);
EXPECT_EQ (QofInt128(UINT64_C(534327326303355007),
UINT64_C(3810195028972355394)), r);
nbig.div (-big, q, r);
EXPECT_EQ (two, q);
EXPECT_EQ (QofInt128(UINT64_C(534327326303355007),
UINT64_C(3810195028972355394)), r);
nbig.div (-big, q, r);
EXPECT_EQ (two, q);
EXPECT_EQ (QofInt128(UINT64_C(534327326303355007),
UINT64_C(3810195028972355394)), r);
big.div (bigger, q, r);
EXPECT_EQ (zero, q);
EXPECT_EQ (big, r);