DfpMath { public static Dfp pow(Dfp base, int a) { boolean invert = false; Dfp result = base.getOne(); if (a == 0) { return result; } if (a < 0) { invert = true; a = -a; } do { Dfp r = new Dfp(base); Dfp prevr; int trial = 1; int prevtrial; do { prevr = new Dfp(r); prevtrial = trial; r = r.multiply(r); trial *= 2; } while (a>trial); r = prevr; trial = prevtrial; a -= trial; result = result.multiply(r); } while (a >= 1); if (invert) { result = base.getOne().divide(result); } return base.newInstance(result); } private  DfpMath(); static Dfp pow(Dfp base, int a); static Dfp exp(final Dfp a); static Dfp log(Dfp a); static Dfp pow(Dfp x, final Dfp y); static Dfp sin(final Dfp a); static Dfp cos(Dfp a); static Dfp tan(final Dfp a); static Dfp atan(final Dfp a); static Dfp asin(final Dfp a); static Dfp acos(Dfp a);  }
@Test public void testPow() { test(DfpMath.pow(factory.newDfp("0"), factory.newDfp("0")), factory.newDfp("1"), 0, "pow #1"); test(DfpMath.pow(factory.newDfp("0"), factory.newDfp("-0")), factory.newDfp("1"), 0, "pow #2"); test(DfpMath.pow(factory.newDfp("2"), factory.newDfp("0")), factory.newDfp("1"), 0, "pow #3"); test(DfpMath.pow(factory.newDfp("-2"), factory.newDfp("-0")), factory.newDfp("1"), 0, "pow #4"); test(DfpMath.pow(pinf, factory.newDfp("-0")), factory.newDfp("1"), 0, "pow #5"); test(DfpMath.pow(pinf, factory.newDfp("0")), factory.newDfp("1"), 0, "pow #6"); test(DfpMath.pow(ninf, factory.newDfp("-0")), factory.newDfp("1"), 0, "pow #7"); test(DfpMath.pow(ninf, factory.newDfp("0")), factory.newDfp("1"), 0, "pow #8"); test(DfpMath.pow(qnan, factory.newDfp("0")), factory.newDfp("1"), 0, "pow #8"); test(DfpMath.pow(factory.newDfp("0"), factory.newDfp("1")), factory.newDfp("0"), 0, "pow #9"); test(DfpMath.pow(factory.newDfp("-0"), factory.newDfp("1")), factory.newDfp("-0"), 0, "pow #10"); test(DfpMath.pow(factory.newDfp("2"), factory.newDfp("1")), factory.newDfp("2"), 0, "pow #11"); test(DfpMath.pow(factory.newDfp("-2"), factory.newDfp("1")), factory.newDfp("-2"), 0, "pow #12"); test(DfpMath.pow(pinf, factory.newDfp("1")), pinf, 0, "pow #13"); test(DfpMath.pow(ninf, factory.newDfp("1")), ninf, 0, "pow #14"); test(DfpMath.pow(qnan, factory.newDfp("1")), qnan, DfpField.FLAG_INVALID, "pow #14.1"); test(DfpMath.pow(factory.newDfp("0"), qnan), qnan, DfpField.FLAG_INVALID, "pow #15"); test(DfpMath.pow(factory.newDfp("-0"), qnan), qnan, DfpField.FLAG_INVALID, "pow #16"); test(DfpMath.pow(factory.newDfp("2"), qnan), qnan, DfpField.FLAG_INVALID, "pow #17"); test(DfpMath.pow(factory.newDfp("-2"), qnan), qnan, DfpField.FLAG_INVALID, "pow #18"); test(DfpMath.pow(pinf, qnan), qnan, DfpField.FLAG_INVALID, "pow #19"); test(DfpMath.pow(ninf, qnan), qnan, DfpField.FLAG_INVALID, "pow #20"); test(DfpMath.pow(qnan, qnan), qnan, DfpField.FLAG_INVALID, "pow #21"); test(DfpMath.pow(qnan, factory.newDfp("1")), qnan, DfpField.FLAG_INVALID, "pow #22"); test(DfpMath.pow(qnan, factory.newDfp("-1")), qnan, DfpField.FLAG_INVALID, "pow #23"); test(DfpMath.pow(qnan, pinf), qnan, DfpField.FLAG_INVALID, "pow #24"); test(DfpMath.pow(qnan, ninf), qnan, DfpField.FLAG_INVALID, "pow #25"); test(DfpMath.pow(qnan, qnan), qnan, DfpField.FLAG_INVALID, "pow #26"); test(DfpMath.pow(factory.newDfp("2"), pinf), pinf, 0, "pow #27"); test(DfpMath.pow(factory.newDfp("-2"), pinf), pinf, 0, "pow #28"); test(DfpMath.pow(pinf, pinf), pinf, 0, "pow #29"); test(DfpMath.pow(ninf, pinf), pinf, 0, "pow #30"); test(DfpMath.pow(factory.newDfp("2"), ninf), factory.getZero(), 0, "pow #31"); test(DfpMath.pow(factory.newDfp("-2"), ninf), factory.getZero(), 0, "pow #32"); test(DfpMath.pow(pinf, ninf), factory.getZero(), 0, "pow #33"); test(DfpMath.pow(ninf, ninf), factory.getZero(), 0, "pow #34"); test(DfpMath.pow(factory.newDfp("0.5"), pinf), factory.getZero(), 0, "pow #35"); test(DfpMath.pow(factory.newDfp("-0.5"), pinf), factory.getZero(), 0, "pow #36"); test(DfpMath.pow(factory.newDfp("0.5"), ninf), pinf, 0, "pow #37"); test(DfpMath.pow(factory.newDfp("-0.5"), ninf), pinf, 0, "pow #38"); test(DfpMath.pow(factory.getOne(), pinf), qnan, DfpField.FLAG_INVALID, "pow #39"); test(DfpMath.pow(factory.getOne(), ninf), qnan, DfpField.FLAG_INVALID, "pow #40"); test(DfpMath.pow(factory.newDfp("-1"), pinf), qnan, DfpField.FLAG_INVALID, "pow #41"); test(DfpMath.pow(factory.getOne().negate(), ninf), qnan, DfpField.FLAG_INVALID, "pow #42"); test(DfpMath.pow(factory.newDfp("0"), factory.newDfp("1")), factory.newDfp("0"), 0, "pow #43"); test(DfpMath.pow(factory.newDfp("0"), factory.newDfp("1e30")), factory.newDfp("0"), 0, "pow #44"); test(DfpMath.pow(factory.newDfp("0"), factory.newDfp("1e-30")), factory.newDfp("0"), 0, "pow #45"); test(DfpMath.pow(factory.newDfp("0"), pinf), factory.newDfp("0"), 0, "pow #46"); test(DfpMath.pow(factory.newDfp("-0"), factory.newDfp("2")), factory.newDfp("0"), 0, "pow #47"); test(DfpMath.pow(factory.newDfp("-0"), factory.newDfp("1e30")), factory.newDfp("0"), 0, "pow #48"); test(DfpMath.pow(factory.newDfp("-0"), factory.newDfp("1e-30")), factory.newDfp("0"), DfpField.FLAG_INEXACT, "pow #49"); test(DfpMath.pow(factory.newDfp("-0"), pinf), factory.newDfp("0"), 0, "pow #50"); test(DfpMath.pow(factory.newDfp("0"), factory.newDfp("-1")), pinf, 0, "pow #51"); test(DfpMath.pow(factory.newDfp("0"), factory.newDfp("-1e30")), pinf, 0, "pow #52"); test(DfpMath.pow(factory.newDfp("0"), factory.newDfp("-1e-30")), pinf, 0, "pow #53"); test(DfpMath.pow(factory.newDfp("0"), ninf), pinf, 0, "pow #54"); test(DfpMath.pow(factory.newDfp("-0"), factory.newDfp("-2")), pinf, 0, "pow #55"); test(DfpMath.pow(factory.newDfp("-0"), factory.newDfp("-1e30")), pinf, 0, "pow #56"); test(DfpMath.pow(factory.newDfp("-0"), factory.newDfp("-1e-30")), pinf, DfpField.FLAG_INEXACT, "pow #57"); test(DfpMath.pow(factory.newDfp("-0"), ninf), pinf, 0, "pow #58"); test(DfpMath.pow(factory.newDfp("-0"), factory.newDfp("-1")), ninf, DfpField.FLAG_INEXACT, "pow #59"); test(DfpMath.pow(factory.newDfp("-0"), factory.newDfp("-12345")), ninf, DfpField.FLAG_INEXACT, "pow #60"); test(DfpMath.pow(factory.newDfp("-0"), factory.newDfp("3")), factory.newDfp("-0"), DfpField.FLAG_INEXACT, "pow #61"); test(DfpMath.pow(factory.newDfp("-0"), factory.newDfp("12345")), factory.newDfp("-0"), DfpField.FLAG_INEXACT, "pow #62"); test(DfpMath.pow(pinf, factory.newDfp("3")), pinf, 0, "pow #63"); test(DfpMath.pow(pinf, factory.newDfp("1e30")), pinf, 0, "pow #64"); test(DfpMath.pow(pinf, factory.newDfp("1e-30")), pinf, 0, "pow #65"); test(DfpMath.pow(pinf, pinf), pinf, 0, "pow #66"); test(DfpMath.pow(pinf, factory.newDfp("-3")), factory.getZero(), 0, "pow #67"); test(DfpMath.pow(pinf, factory.newDfp("-1e30")), factory.getZero(), 0, "pow #68"); test(DfpMath.pow(pinf, factory.newDfp("-1e-30")), factory.getZero(), 0, "pow #69"); test(DfpMath.pow(pinf, ninf), factory.getZero(), 0, "pow #70"); test(DfpMath.pow(ninf, factory.newDfp("-2")), factory.newDfp("0"), 0, "pow #71"); test(DfpMath.pow(ninf, factory.newDfp("-1e30")), factory.newDfp("0"), 0, "pow #72"); test(DfpMath.pow(ninf, factory.newDfp("-1e-30")), factory.newDfp("0"), DfpField.FLAG_INEXACT, "pow #73"); test(DfpMath.pow(ninf, ninf), factory.newDfp("0"), 0, "pow #74"); test(DfpMath.pow(ninf, factory.newDfp("2")), pinf, 0, "pow #75"); test(DfpMath.pow(ninf, factory.newDfp("1e30")), pinf, 0, "pow #76"); test(DfpMath.pow(ninf, factory.newDfp("1e-30")), pinf, DfpField.FLAG_INEXACT, "pow #77"); test(DfpMath.pow(ninf, pinf), pinf, 0, "pow #78"); test(DfpMath.pow(ninf, factory.newDfp("3")), ninf, DfpField.FLAG_INEXACT, "pow #79"); test(DfpMath.pow(ninf, factory.newDfp("12345")), ninf, DfpField.FLAG_INEXACT, "pow #80"); test(DfpMath.pow(ninf, factory.newDfp("-3")), factory.newDfp("-0"), DfpField.FLAG_INEXACT, "pow #81"); test(DfpMath.pow(ninf, factory.newDfp("-12345")), factory.newDfp("-0"), DfpField.FLAG_INEXACT, "pow #82"); test(DfpMath.pow(factory.newDfp("-2"), factory.newDfp("3")), factory.newDfp("-8"), DfpField.FLAG_INEXACT, "pow #83"); test(DfpMath.pow(factory.newDfp("-2"), factory.newDfp("16")), factory.newDfp("65536"), 0, "pow #84"); test(DfpMath.pow(factory.newDfp("-2"), factory.newDfp("-3")), factory.newDfp("-0.125"), DfpField.FLAG_INEXACT, "pow #85"); test(DfpMath.pow(factory.newDfp("-2"), factory.newDfp("-4")), factory.newDfp("0.0625"), 0, "pow #86"); test(DfpMath.pow(factory.newDfp("-2"), factory.newDfp("-4.1")), qnan, DfpField.FLAG_INVALID|DfpField.FLAG_INEXACT, "pow #87"); test(DfpMath.pow(factory.newDfp("2"),factory.newDfp("1.5")), factory.newDfp("2.8284271247461901"), DfpField.FLAG_INEXACT, "pow #88"); }