Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling

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??

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

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 on Re: [OT] Function to do x**y for |y|<1 w/o ** operator.
Select or Download Code

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1019737]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others avoiding work at the Monastery: (7)
As of 2015-11-27 21:37 GMT
Find Nodes?
    Voting Booth?

    What would be the most significant thing to happen if a rope (or wire) tied the Earth and the Moon together?

    Results (734 votes), past polls