use Math::BigFloat;
sub Root {
my $num = shift;
my $root = shift;
my $iterations = shift || 5;
if ( $num < 0 ) { return undef }
if ( $root == 0 ) { return 1 }
my $Num = Math::BigFloat->new( $num );
my $Root = Math::BigFloat->new( $root );
my $current = Math::BigFloat->new();
my $guess = Math::BigFloat->new( $num ** ( 1 / $root ) );
my $t = Math::BigFloat->new( $guess ** ( $root - 1 ) );
for ( 1 .. $iterations ) {
$current = $guess - ( $guess * $t - $Num ) / ( $Root * $t );
if ( $guess eq $current ) { last }
$t = $current**($root-1);
$guess = $current;
}
return $current;
}
####
$x = Root( 100, 5 );
##
##
$x = Root( 500000, 555 );