#include "precision.h" | |
/* | |
* Square root | |
*/ | |
precision psqrt(y) | |
precision y; | |
{ | |
int i; | |
precision x = pUndef, lastx = pUndef; | |
i = pcmpz(pparm(y)); | |
if (i == 0) { /* if y == 0 */ | |
pset(&lastx, pzero); | |
} else if (i < 0) { /* if y negative */ | |
pset(&x, errorp(PDOMAIN, "psqrt", "negative argument")); | |
} else { | |
pset(&x, y); | |
do { | |
pset(&lastx, x); | |
pset(&x, phalf(padd(x, pdiv(y, x)))); | |
} while (plt(x, lastx)); | |
} | |
pdestroy(x); | |
pdestroy(y); | |
return presult(lastx); | |
} |