From 8a6c88f5ff06e8395fcb6eb0b9bf2048448c6f75 Mon Sep 17 00:00:00 2001 From: Arthur Britto Date: Wed, 20 Mar 2013 20:10:34 -0700 Subject: [PATCH 1/2] Fix divRound. --- src/cpp/ripple/SerializedTypes.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpp/ripple/SerializedTypes.h b/src/cpp/ripple/SerializedTypes.h index 96306a79f2..562886bfe0 100644 --- a/src/cpp/ripple/SerializedTypes.h +++ b/src/cpp/ripple/SerializedTypes.h @@ -442,7 +442,7 @@ public: static STAmount divRound(const STAmount& v1, const STAmount& v2, const STAmount& saUnit, bool roundUp) { return divRound(v1, v2, saUnit.getCurrency(), saUnit.getIssuer(), roundUp); } static STAmount divRound(const STAmount& v1, const STAmount& v2, bool roundUp) - { return divRound(v1, v2, v2.getCurrency(), v2.getIssuer(), roundUp); } + { return divRound(v1, v2, v1.getCurrency(), v1.getIssuer(), roundUp); } // Someone is offering X for Y, what is the rate? // Rate: smaller is better, the taker wants the most out: in/out From 7074842fbc06293e933f629327986bc70f4f9adb Mon Sep 17 00:00:00 2001 From: Arthur Britto Date: Wed, 20 Mar 2013 20:10:57 -0700 Subject: [PATCH 2/2] Improve ripple rounding. --- src/cpp/ripple/RippleCalc.cpp | 36 +++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/src/cpp/ripple/RippleCalc.cpp b/src/cpp/ripple/RippleCalc.cpp index 993783f681..bf94a47839 100644 --- a/src/cpp/ripple/RippleCalc.cpp +++ b/src/cpp/ripple/RippleCalc.cpp @@ -708,6 +708,7 @@ void RippleCalc::setCanonical(STPathSet& spsDst, const std::vector uQualityOut // saPrvReq -> saCurReq // sqPrvAct -> saCurAct @@ -1728,7 +1732,7 @@ void RippleCalc::calcNodeRipple( const uint160 uCurIssuerID = saCur.getIssuer(); // const uint160 uPrvIssuerID = saPrv.getIssuer(); - STAmount saCurIn = STAmount::divide(STAmount::multiply(saCur, uQualityOut, uCurrencyID, uCurIssuerID), uQualityIn, uCurrencyID, uCurIssuerID); + STAmount saCurIn = STAmount::divRound(STAmount::mulRound(saCur, uQualityOut, uCurrencyID, uCurIssuerID, true), uQualityIn, uCurrencyID, uCurIssuerID, true); cLog(lsTRACE) << boost::str(boost::format("calcNodeRipple: bPrvUnlimited=%d saPrv=%s saCurIn=%s") % bPrvUnlimited % saPrv.getFullText() % saCurIn.getFullText()); if (bPrvUnlimited || saCurIn <= saPrv) @@ -1741,7 +1745,7 @@ void RippleCalc::calcNodeRipple( else { // A part of cur. All of prv. (cur as driver) - STAmount saCurOut = STAmount::divide(STAmount::multiply(saPrv, uQualityIn, uCurrencyID, uCurIssuerID), uQualityOut, uCurrencyID, uCurIssuerID); + STAmount saCurOut = STAmount::divRound(STAmount::mulRound(saPrv, uQualityIn, uCurrencyID, uCurIssuerID, true), uQualityOut, uCurrencyID, uCurIssuerID, true); cLog(lsTRACE) << boost::str(boost::format("calcNodeRipple:4: saCurReq=%s") % saCurReq.getFullText()); saCurAct += saCurOut; @@ -2239,7 +2243,7 @@ TER RippleCalc::calcNodeAccountFwd( STAmount saIssueCrd = uQualityIn >= QUALITY_ONE ? saPrvIssueReq // No fee. - : STAmount::multiply(saPrvIssueReq, STAmount(CURRENCY_ONE, ACCOUNT_ONE, uQualityIn, -9)); // Amount to credit. + : STAmount::mulRound(saPrvIssueReq, STAmount(CURRENCY_ONE, ACCOUNT_ONE, uQualityIn, -9), false); // Amount to credit. // Amount to credit. Credit for less than received as a surcharge. saCurReceive = saPrvRedeemReq+saIssueCrd;