>>21に敬意を込めて
double pow_n(double a, uint_t n)
{
double r = a;
for (--n; n > 0; n >>= 1) {
if (n & 1)
r *= a;
a *= a;
}
return r;
}

doubleの乗算が少し減るかも。
ただしn>1になるが