Skip to content

Commit

Permalink
osmomath: AddMut and QuoMut (backport #3779) (#3826)
Browse files Browse the repository at this point in the history
* osmomath: `AddMut` and `QuoMut` (#3779)

* mut add

* test add mut

* quo  mut

* test quo mut/ remove want from test struct

* refactor exp

* change mutatives code

* change

* not allocaing

* exp change to quomut

* remove file

* refactor quo

* refactor ad

* refactor tests

(cherry picked from commit ca6ccbd)

# Conflicts:
#	osmomath/exp2.go

* Delete exp2.go

Co-authored-by: Ruslan Akhtariev <[email protected]>
Co-authored-by: Dev Ojha <[email protected]>
  • Loading branch information
3 people authored Dec 22, 2022
1 parent d9480f4 commit 1189148
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 10 deletions.
34 changes: 24 additions & 10 deletions osmomath/decimal.go
Original file line number Diff line number Diff line change
Expand Up @@ -240,12 +240,20 @@ func (d BigDec) BigInt() *big.Int {

// addition
func (d BigDec) Add(d2 BigDec) BigDec {
res := new(big.Int).Add(d.i, d2.i)
copy := d.Clone()
copy.AddMut(d2)
return copy
}

if res.BitLen() > maxDecBitLen {
// mutative addition
func (d BigDec) AddMut(d2 BigDec) BigDec {
d.i.Add(d.i, d2.i)

if d.i.BitLen() > maxDecBitLen {
panic("Int overflow")
}
return BigDec{res}

return d
}

// subtraction
Expand Down Expand Up @@ -319,19 +327,25 @@ func (d BigDec) MulInt64(i int64) BigDec {

// quotient
func (d BigDec) Quo(d2 BigDec) BigDec {
copy := d.Clone()
copy.QuoMut(d2)
return copy
}

// mutative quotient
func (d BigDec) QuoMut(d2 BigDec) BigDec {
// multiply precision twice
mul := new(big.Int).Mul(d.i, precisionReuse)
mul.Mul(mul, precisionReuse)
d.i.Mul(d.i, precisionReuse)
d.i.Mul(d.i, precisionReuse)

quo := new(big.Int).Quo(mul, d2.i)
chopped := chopPrecisionAndRound(quo)
d.i.Quo(d.i, d2.i)
chopPrecisionAndRound(d.i)

if chopped.BitLen() > maxDecBitLen {
if d.i.BitLen() > maxDecBitLen {
panic("Int overflow")
}
return BigDec{chopped}
return d
}

func (d BigDec) QuoRaw(d2 int64) BigDec {
// multiply precision, so we can chop it later
mul := new(big.Int).Mul(d.i, precisionReuse)
Expand Down
47 changes: 47 additions & 0 deletions osmomath/decimal_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,53 @@ func (s *decimalTestSuite) assertMutResult(expectedResult, startValue, mutativeR
s.Require().Equal(nonMutativeStartValue, startValue)
}

func (s *decimalTestSuite) TestAddMut() {
toAdd := osmomath.MustNewDecFromStr("10")
tests := map[string]struct {
startValue osmomath.BigDec
expectedMutResult osmomath.BigDec
}{
"0": {osmomath.NewBigDec(0), osmomath.NewBigDec(10)},
"1": {osmomath.NewBigDec(1), osmomath.NewBigDec(11)},
"10": {osmomath.NewBigDec(10), osmomath.NewBigDec(20)},
}

for name, tc := range tests {
s.Run(name, func() {
startMut := tc.startValue.Clone()
startNonMut := tc.startValue.Clone()

resultMut := startMut.AddMut(toAdd)
resultNonMut := startNonMut.Add(toAdd)

s.assertMutResult(tc.expectedMutResult, tc.startValue, resultMut, resultNonMut, startMut, startNonMut)
})
}
}

func (s *decimalTestSuite) TestQuoMut() {
quoBy := osmomath.MustNewDecFromStr("2")
tests := map[string]struct {
startValue osmomath.BigDec
expectedMutResult osmomath.BigDec
}{
"0": {osmomath.NewBigDec(0), osmomath.NewBigDec(0)},
"1": {osmomath.NewBigDec(1), osmomath.MustNewDecFromStr("0.5")},
"10": {osmomath.NewBigDec(10), osmomath.NewBigDec(5)},
}

for name, tc := range tests {
s.Run(name, func() {
startMut := tc.startValue.Clone()
startNonMut := tc.startValue.Clone()

resultMut := startMut.QuoMut(quoBy)
resultNonMut := startNonMut.Quo(quoBy)

s.assertMutResult(tc.expectedMutResult, tc.startValue, resultMut, resultNonMut, startMut, startNonMut)
})
}
}
func TestDecApproxEq(t *testing.T) {
// d1 = 0.55, d2 = 0.6, tol = 0.1
d1 := osmomath.NewDecWithPrec(55, 2)
Expand Down

0 comments on commit 1189148

Please sign in to comment.