|Just another Perl shrine|
Re: [OT] Function to do x**y for |y|<1 w/o ** operator.by salva (Monsignor)
|on Feb 20, 2013 at 11:37 UTC||Need Help??|
Another solution based on the fact that a floating point number is actually a sum of powers of 2.
For 0 <= y <= 0, it holds that y = b0*20 + b1*2-1 + b2*2-2 + b3*2-3 + ...
And so, xy = xb0*20 + b1*2-1 + b2*2-2 + b3*2-3 + ... = xb0*20 * xb1*2-1 * xb2*2-2 * xb3*2-3 * ... = Πi, bi≠0 x2-i
Which in Perl becomes...
sqrt is also an expensive operation. If you have to calculate xy for different values of y while x stays constant, you may be able to speed up the process creating a table with the values of x2-i.
Alternatively, you can write a function to calculate ex (using a table with the values of e2i), and then calculate xy as elog(x)*y.
update: there are also several implementations of exp(x) freely available, for instance, the one in OpenBSD is here.