BigComplexMath { public static BigComplex pow(BigComplex x, long y, MathContext mathContext) { MathContext mc = new MathContext(mathContext.getPrecision() + 10, mathContext.getRoundingMode()); if (y < 0) { return BigComplex.ONE.divide(pow(x, -y, mc), mc).round(mathContext); } BigComplex result = BigComplex.ONE; while (y > 0) { if ((y & 1) == 1) { result = result.multiply(x, mc); y -= 1; } if (y > 0) { x = x.multiply(x, mc); } y >>= 1; } return result.round(mathContext); }  static BigComplex reciprocal(BigComplex x, MathContext mathContext); static BigComplex conjugate(BigComplex x); static BigDecimal abs(BigComplex x, MathContext mathContext); static BigDecimal absSquare(BigComplex x, MathContext mathContext); static BigDecimal angle(BigComplex x, MathContext mathContext); static BigComplex factorial(BigComplex x, MathContext mathContext); static BigComplex gamma(BigComplex x, MathContext mathContext); static BigComplex exp(BigComplex x, MathContext mathContext); static BigComplex sin(BigComplex x, MathContext mathContext); static BigComplex cos(BigComplex x, MathContext mathContext); static BigComplex tan(BigComplex x, MathContext mathContext); static BigComplex atan(BigComplex x, MathContext mathContext); static BigComplex acot(BigComplex x, MathContext mathContext); static BigComplex asin(BigComplex x, MathContext mathContext); static BigComplex acos(BigComplex x, MathContext mathContext); static BigComplex sqrt(BigComplex x, MathContext mathContext); static BigComplex log(BigComplex x, MathContext mathContext); static BigComplex pow(BigComplex x, long y, MathContext mathContext); static BigComplex pow(BigComplex x, BigDecimal y, MathContext mathContext); static BigComplex pow(BigComplex x, BigComplex y, MathContext mathContext); static BigComplex root(BigComplex x, BigDecimal n, MathContext mathContext); static BigComplex root(BigComplex x, BigComplex n, MathContext mathContext);  }
@Test public void testPowInt() { assertPrecisionCalculation( BigComplex.valueOf(new BigDecimal("18456.81197182559"), new BigDecimal("-7537.93433754262")), (mc) -> BigComplexMath.pow(BigComplex.valueOf(1.1, 2.2), 11, mc), 5); assertPrecisionCalculation( BigComplex.valueOf(new BigDecimal("0.00004643522633206022281216609142474444925257050125807831"), new BigDecimal("0.00001896457999216310228315702790913198870386323455307511")).round(MC), (mc) -> BigComplexMath.pow(BigComplex.valueOf(1.1, 2.2), -11, mc), 5); }
@Test public void testPow() { assertPrecisionCalculation( BigComplex.valueOf(new BigDecimal("0.93025840620844374948965939784803335557080436887094399412"), new BigDecimal("2.5254359132812654282958795629575897052282541443174302618")).round(MC), (mc) -> BigComplexMath.pow(BigComplex.valueOf(1.1, 2.2), BigDecimal.valueOf(1.1), mc), 5); }
@Test public void testPowComplex() { assertPrecisionCalculation( BigComplex.valueOf(new BigDecimal("0.84004892508974359637454837539731545717714689412422564692"), new BigDecimal("0.25134081792349062667714080016033852435880339768328815847")).round(MC), (mc) -> BigComplexMath.pow(BigComplex.valueOf(1.1, 2.2), BigComplex.valueOf(0.1, 0.2), mc), 5); }