mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-27 14:35:52 +00:00
Fix a native*native bug. Add a test to make sure integer multiplications give exact results.
This commit is contained in:
@@ -920,7 +920,7 @@ STAmount STAmount::multiply(const STAmount& v1, const STAmount& v2, const uint16
|
|||||||
if (v1.isZero() || v2.isZero())
|
if (v1.isZero() || v2.isZero())
|
||||||
return STAmount(uCurrencyID, uIssuerID);
|
return STAmount(uCurrencyID, uIssuerID);
|
||||||
|
|
||||||
if (v1.mIsNative && v2.mIsNative)
|
if (v1.mIsNative && v2.mIsNative && uCurrencyID.isZero())
|
||||||
{
|
{
|
||||||
uint64 minV = (v1.getSNValue() < v2.getSNValue()) ? v1.getSNValue() : v2.getSNValue();
|
uint64 minV = (v1.getSNValue() < v2.getSNValue()) ? v1.getSNValue() : v2.getSNValue();
|
||||||
uint64 maxV = (v1.getSNValue() < v2.getSNValue()) ? v2.getSNValue() : v1.getSNValue();
|
uint64 maxV = (v1.getSNValue() < v2.getSNValue()) ? v2.getSNValue() : v1.getSNValue();
|
||||||
@@ -1430,6 +1430,22 @@ static void roundTest(int n, int d, int m)
|
|||||||
BOOST_FAIL("STAmount rounding failure");
|
BOOST_FAIL("STAmount rounding failure");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void mulTest(int a, int b)
|
||||||
|
{
|
||||||
|
STAmount aa(CURRENCY_ONE, ACCOUNT_ONE, a);
|
||||||
|
STAmount bb(CURRENCY_ONE, ACCOUNT_ONE, b);
|
||||||
|
STAmount prod1(STAmount::multiply(aa, bb, CURRENCY_ONE, ACCOUNT_ONE));
|
||||||
|
if (prod1.isNative())
|
||||||
|
BOOST_FAIL("product is native");
|
||||||
|
|
||||||
|
STAmount prod2(CURRENCY_ONE, ACCOUNT_ONE, a * b);
|
||||||
|
if (prod1 == prod2)
|
||||||
|
return;
|
||||||
|
Log(lsWARNING) << "(" << aa.getFullText() << " * " << bb.getFullText() << ") = " << prod1.getFullText()
|
||||||
|
<< " not " << prod2.getFullText();
|
||||||
|
BOOST_FAIL("Multiplication result is not exact");
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE( CurrencyMulDivTests )
|
BOOST_AUTO_TEST_CASE( CurrencyMulDivTests )
|
||||||
{
|
{
|
||||||
// Test currency multiplication and division operations such as
|
// Test currency multiplication and division operations such as
|
||||||
@@ -1452,12 +1468,10 @@ BOOST_AUTO_TEST_CASE( CurrencyMulDivTests )
|
|||||||
if (STAmount::getRate(STAmount(10), STAmount(CURRENCY_ONE, ACCOUNT_ONE, 1)) != (((100ul-16)<<(64-8))|1000000000000000ul))
|
if (STAmount::getRate(STAmount(10), STAmount(CURRENCY_ONE, ACCOUNT_ONE, 1)) != (((100ul-16)<<(64-8))|1000000000000000ul))
|
||||||
BOOST_FAIL("STAmount getRate fail");
|
BOOST_FAIL("STAmount getRate fail");
|
||||||
|
|
||||||
roundTest(1, 3, 3);
|
roundTest(1, 3, 3); roundTest(2, 3, 9); roundTest(1, 7, 21); roundTest(1, 2, 4);
|
||||||
roundTest(2, 3, 9);
|
roundTest(3, 9, 18); roundTest(7, 11, 44);
|
||||||
roundTest(1, 7, 21);
|
|
||||||
roundTest(1, 2, 4);
|
mulTest(100, 1000); mulTest(1, 2); mulTest(32, 15); mulTest(981, 4012);
|
||||||
roundTest(3, 9, 18);
|
|
||||||
roundTest(7, 11, 44);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_SUITE_END()
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
|||||||
Reference in New Issue
Block a user