blob: 00531a6fd65293121f0af9261b9f32f21d95461f [file] [log] [blame]
#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);
}