If you have

`log` available, you can use

Newton method to easyly find the solution to the equation

`f(z) = log(z) - y * log x = 0` :

`#!/usr/bin/perl
use strict;
use warnings;
my ($X, $Y, $n) = @ARGV;
$n ||= 20;
my $Z = $X ** $Y;
# f(z) = log z - y * log x = 0;
# f'(z) = f1(z) = 1/z
my $ylogx = $Y * log $X;
my $z = 1;
for my $i (1..$n) {
my $fz = log($z) - $ylogx;
my $f1z = 1 / $z;
$z = $z - $fz / $f1z;
my $e = abs($z - $Z);
printf "%3d: z=%8f, e=%8f\n", $i, $z, $e;
}
`

This method does not handle correctly values of

`y < 0` but this is not a problem because

`z(y) = 1 / z(-y)`.

Also, note that even if the algorithm converges in very few iterations, it uses `log` that is usually an expensive operation and so, other methods requiring more iterations may be actually faster.

Comment onRe: [OT] Function to do x**y for |y|<1 w/o ** operator.SelectorDownloadCode