/* cr90 compares the values of two multiple precision numbers */ int __cr(const mp_no *x, const mp_no *y, int p) { int i; if (X[0] > Y[0]) i= 1; else if (X[0] < Y[0]) i=-1; else if (X[0] < ZERO ) i= __acr(y,x,p); else i= __acr(x,y,p); return i; }
/* Subtract *Y from *X and return the result in *Z. X and Y may overlap but not X and Z or Y and Z. One guard digit is used. The error is less than one ULP. */ void SECTION __sub (const mp_no *x, const mp_no *y, mp_no *z, int p) { int n; if (X[0] == 0) { __cpy (y, z, p); Z[0] = -Z[0]; return; } else if (Y[0] == 0) { __cpy (x, z, p); return; } if (X[0] != Y[0]) { if (__acr (x, y, p) > 0) { add_magnitudes (x, y, z, p); Z[0] = X[0]; } else { add_magnitudes (y, x, z, p); Z[0] = -Y[0]; } } else { if ((n = __acr (x, y, p)) == 1) { sub_magnitudes (x, y, z, p); Z[0] = X[0]; } else if (n == -1) { sub_magnitudes (y, x, z, p); Z[0] = -Y[0]; } else Z[0] = 0; } }
void __add(const mp_no *x, const mp_no *y, mp_no *z, int p) { int n; if (X[0] == ZERO) {__cpy(y,z,p); return; } else if (Y[0] == ZERO) {__cpy(x,z,p); return; } if (X[0] == Y[0]) { if (__acr(x,y,p) > 0) {add_magnitudes(x,y,z,p); Z[0] = X[0]; } else {add_magnitudes(y,x,z,p); Z[0] = Y[0]; } } else { if ((n=__acr(x,y,p)) == 1) {sub_magnitudes(x,y,z,p); Z[0] = X[0]; } else if (n == -1) {sub_magnitudes(y,x,z,p); Z[0] = Y[0]; } else Z[0] = ZERO; } return; }