diff --git a/decimal.go b/decimal.go index acb49aa..5abc079 100644 --- a/decimal.go +++ b/decimal.go @@ -364,6 +364,22 @@ func (d Decimal) Mod(d2 Decimal) Decimal { return d.Sub(d2.Mul(quo)) } +// Pow returns d to the power d2 +func (d Decimal) Pow(d2 Decimal) Decimal { + var temp Decimal + if d2.IntPart() == 0 { + return NewFromFloat(1) + } + temp = d.Pow(d2.Div(NewFromFloat(2))) + if d2.IntPart()%2 == 0 { + return temp.Mul(temp) + } + if d2.IntPart() > 0 { + return temp.Mul(temp).Mul(d) + } + return temp.Mul(temp).Div(d) +} + // Cmp compares the numbers represented by d and d2 and returns: // // -1 if d < d2 diff --git a/decimal_test.go b/decimal_test.go index abb6d5a..922acae 100644 --- a/decimal_test.go +++ b/decimal_test.go @@ -1283,6 +1283,15 @@ func TestDecimal_Cmp2(t *testing.T) { } } +func TestPow(t *testing.T) { + a := New(4, 0) + b := New(2, 0) + x := a.Pow(b) + if x.String() != "16" { + t.Errorf("Error, saw %s", x.String()) + } +} + func didPanic(f func()) bool { ret := false func() {