note
salva
If you have <c>log</c> available, you can use [http://en.wikipedia.org/wiki/Newton%27s_method|Newton method] to easyly find the solution to the equation <c>f(z) = log(z) - y * log x = 0</c> :
<c>
#!/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;
}
</c>
This method does not handle correctly values of <c>y < 0</c> but this is not a problem because <c>z(y) = 1 / z(-y)</c>.
<p>Also, note that even if the algorithm converges in very few iterations, it uses <c>log</c> that is usually an expensive operation and so, other methods requiring more iterations may be actually faster.
1019644
1019644