diff --git a/decimal.go b/decimal.go index 91f9f6c..a0eb9c0 100644 --- a/decimal.go +++ b/decimal.go @@ -301,6 +301,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 b0b2088..1221913 100644 --- a/decimal_test.go +++ b/decimal_test.go @@ -1025,6 +1025,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() {