The original solution is perfect. Seems to be faster if pulling the condition of the negative outside.
double pow(double x, int n) {
return n < 0 ? 1/pow(x, (long)-1*n) : pow(x, (long)n);
}
double __pow(double x, long n) {
if (n == 0) return 1;
if (n == 1) return x;
if (n == 2) return x * x;
if(n % 2)
return __pow(__pow(x, n / 2), 2);
else
return __pow(__pow(x, n / 2), 2) * x;
}