|
|
| Just another Perl shrine | |
| PerlMonks |
Re: [OT] Function to do x**y for |y|<1 w/o ** operator.by salva (Monsignor) |
| on Feb 20, 2013 at 11:37 UTC ( #1019768=note: print w/ replies, xml ) | 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.
In Section
Seekers of Perl Wisdom
|
|
||||||||||||||||||||