| #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); | |
| } |