Return Styles: Pseud0ch, Terminal, Valhalla, NES, Geocities, Blue Moon. Entire thread

Fast positive integer power function

Name: Anonymous 2012-04-15 6:00

I'm trying to figure out how to compute an integer power of a double efficiently with as little overhead as possible (trying to avoid loops and recursion to minimize the amount of calls and jumps). Calculation speed is the priority.
So far I got this trivial piece of code:

double f(double a,char b){
if(b==2)return a*a;
if(b==3)return a*a*a;
if(b==4)return a*a*a*a;
if(b==5)return a*a*a*a*a;
if(b==6)return a*a*a*a*a*a;
if(b==7)return a*a*a*a*a*a*a;
if(b==8)return a*a*a*a*a*a*a*a;
if(b==9)return a*a*a*a*a*a*a*a*a;
        return a*a*a*a*a*a*a*a*a*a;
}


...which of course assumes the exponent is at most 10. The code can easily be expanded if higher exponents are needed.
I'm thinking this is probably optimal, but I know you /prog/riders have some magic tricks up your sleeve, so hit me with them.

Name: Anonymous 2012-04-15 8:13

>>16
double g(double a, unsigned b)
{
    double c, d = 1;
    unsigned e;

    for (; b > 0; b -= e) {
        c = a;
        for (e = 1; (e<<1) <= b; e <<= 1) { c *= c; }
        d *= c;
    }

    return d;
}


My test indicates that your function gives imprecise results.
f:   0.207229: 9999990000004500129961189827839490010025633955437521662187637223456768.000000
g:   1.470572: 9999990000004500129961189827839490010025633955437521662187637223456768.000000
pow: 1.312694: 9999990000004498597465648961950631651678606805128338043448515039854592.000000


That's for 9999999^10

Newer Posts
Don't change these.
Name: Email:
Entire Thread Thread List