Your skill will accomplishwhat the force of many cannot PerlMonks

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

by salva (Abbot)
 on Feb 20, 2013 at 09:18 UTC ( #1019737=note: print w/replies, xml ) Need Help??

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.

Create A New User
Node Status?
node history
Node Type: note [id://1019737]
help
Chatterbox?
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others lurking in the Monastery: (7)
As of 2018-05-24 12:55 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
World peace can best be achieved by:

Results (177 votes). Check out past polls.

Notices?