Thanks for sending a working solution. A simpler version with less nesting and fewer assignments is:
real h(real a, real b) {
return (pow(a, b) - 1) / b;
}
real g(real y, real p) {
real eps = 0.005;
if (y >= 0) {
if (abs(p) <= eps)
return log1p(y);
return h(1 + y, p);
}
if (p >= 2 - eps && p <= 2 + eps)
return -log1m(y);
return -h(1 - y, 2 - p);
}
It avoids recomputation of 2 - p
into the bargain.