Most programming languages have a built-in implementation of exponentiation.



Task

Re-implement integer exponentiation for both   intint   and   floatint   as both a procedure,   and an operator (if your language supports operator definition).

If the language supports operator (or procedure) overloading, then an overloaded form should be provided for both   intint   and   floatint   variants.



Related tasks

   Exponentiation order
   arbitrary-precision integers (included)
   Exponentiation with infix operators in (or operating on) the base


class Num2 {
    static ipow(i, exp) {
        if (!i.isInteger) Fiber.abort("ipow method must have an integer receiver")
        if (!exp.isInteger) Fiber.abort("ipow method must have an integer exponent")
        if (i == 1 || exp == 0) return 1
        if (i == -1) return (exp%2 == 0) ? 1 : -1
        if (exp < 0) Fiber.abort("ipow method cannot have a negative exponent")  
        var ans = 1
        var base = i
        var e = exp
        while (e > 1) {
            if (e%2 == 1) ans = ans * base
            e = (e/2).floor
            base = base * base
        }
        return ans * base
    }
 
    static fpow(f, exp) {
        if (!exp.isInteger) Fiber.abort("fpow method must have an integer exponent")
        var ans = 1.0
        var e = exp
        var base = (e < 0) ? 1/f : f
        if (e < 0) e = -e
        while (e > 0) {
            if (e%2 == 1) ans = ans * base
            e = (e/2).floor
            base = base * base
        }
        return ans
    }
 
    construct new(n) { _n = n }
 
    ^(exp) {
        if (_n.isInteger && (exp >= 0 || _n.abs == 1)) return Num2.ipow(_n, exp)
        return Num2.fpow(_n, exp)
    }
}
 
System.print("Using static methods:")
System.print("  2  ^  3   = %(Num2.ipow(2, 3))")
System.print("  1  ^ -10  = %(Num2.ipow(1, -10))")
System.print(" -1  ^ -3   = %(Num2.ipow(-1, -3))")
System.print()
System.print("  2.0 ^ -3  = %(Num2.fpow(2.0, -3))")
System.print("  1.5 ^  0  = %(Num2.fpow(1.5, 0))")
System.print("  4.5 ^  2  = %(Num2.fpow(4.5, 2))")
 
System.print("\nUsing the ^ operator:")
System.print("  2  ^  3   = %(Num2.new(2) ^ 3)")
System.print("  1  ^ -10  = %(Num2.new(1) ^ -10)")
System.print(" -1  ^ -3   = %(Num2.new(-1) ^ -3)")
System.print()
System.print("  2.0 ^ -3  = %(Num2.new(2.0) ^ -3)")
System.print("  1.5 ^  0  = %(Num2.new(1.5) ^ 0)")
System.print("  4.5 ^  2  = %(Num2.new(4.5) ^ 2)")