|
#define X_INIT (1 << 8) /* Arbitrary initial value for x */
|
|
unsigned long newton_sqrt(unsigned long z)
|
|
{
|
|
unsigned long x;
|
|
unsigned long x_next = X_INIT;
|
|
int maxiter = 8 * sizeof(z);
|
|
|
|
while (x != x_next && maxiter-- > 0) {
|
|
x = x_next;
|
|
x_next = (x + z / x) / 2;
|
|
}
|
|
return x;
|
|
}
|