#!/usr/bin/perl

use Math::BigInt;
use Math::BigFloat;

# pow($x, $n) raises integer $x to the $nth power, with error checking.
#
sub pow {
    my ($x, $n) = @_;
    return if $n < 1;
    return if $n != int($n);
    return _pow($x, $n);
}

# _pow($x, $n) raises integer $x to the $nth power, with no error checking.
#
sub _pow {
    my ($x, $n) = @_;
    return $x if $n == 1;
    if ($n % 2) {
        return $x * _pow($x, $n - 1);
    } else {
        my $tmp = _pow($x, $n / 2);
        return $tmp * $tmp;
    }
}

$a = pow(3, 5);                   # Same as 3 ** 5, but slower.

$i = Math::BigInt->new(10);
$j = pow($i, 100);                # A googol.

print $j, "\n";

$x = Math::BigFloat->new(1.001);
$e = pow($x, 1000);               # An approximation of e.

print $e, "\n";


