public static object Power(long x, long exp) { if (exp == 0) { return(1); } if (exp == 1) { return(x); } if (exp < 0) { return(FloatOps.Power(x, exp)); } long saveexp = exp; long result = 1; long factor = x; try { checked { while (exp != 0) { if ((exp & 1) != 0) { result = result * factor; } if (exp == 1) { break; // save possible overflow in the multiply } factor = factor * factor; exp >>= 1; } return(result); } } catch (OverflowException) { return(LongOps.Power(BigInteger.Create(x), saveexp)); } }
internal static object Power(int x, int power) { if (power == 0) { return(1); } if (power < 0) { if (x == 0) { throw Ops.ZeroDivisionError("0.0 cannot be raised to a negative power"); } return(FloatOps.Power(x, power)); } int factor = x; int result = 1; int savePower = power; try { checked { while (power != 0) //??? this loop has redundant checks for exit condition { if ((power & 1) != 0) { result = result * factor; } if (power == 1) { break; } factor = factor * factor; power >>= 1; } return(result); } } catch (OverflowException) { return(LongOps.Power(BigInteger.Create(x), savePower)); } }
private static object Power(long x, BigInteger y) { return(LongOps.Power(BigInteger.Create(x), y)); }