double pow_ri (float * ap, int * bp) { double pow, x; int n; unsigned long u; pow = 1; x = *ap; n = *bp; if (n != 0) { if (n < 0) { n = -n; x = 1 / x; } for (u = n;;) { if (u & 01) pow *= x; if (u >>= 1) x *= x; else break; } } return (pow); }