--- gmpxx.h.old 2002-11-20 06:46:56.000000000 +1000 +++ gmpxx.h 2003-06-20 17:11:43.000000000 +1000 @@ -681,7 +681,11 @@ if (mpz_fits_slong_p(w)) mpz_set_si(z, l / mpz_get_si(w)); else - mpz_set_si(z, 0); + { + /* if w is bigger than a long then the quotient must be zero, unless + l==LONG_MIN and w==-LONG_MIN in which case the quotient is -1 */ + mpz_set_si (z, (mpz_cmpabs_ui (w, (l >= 0 ? l : -l)) == 0 ? -1 : 0)); + } } static void eval(mpz_ptr z, mpz_srcptr w, double d) { @@ -872,17 +876,18 @@ } static void eval(mpz_ptr z, mpz_srcptr w, signed long int l) { - if (l >= 0) - mpz_mod_ui(z, w, l); - else - mpz_mod_ui(z, w, -l); + mpz_tdiv_r_ui (z, w, (l >= 0 ? l : -l)); } static void eval(mpz_ptr z, signed long int l, mpz_srcptr w) { if (mpz_fits_slong_p(w)) mpz_set_si(z, l % mpz_get_si(w)); else - mpz_set_si(z, l); + { + /* if w is bigger than a long then the remainder is l unchanged, + unless l==LONG_MIN and w==-LONG_MIN in which case it's 0 */ + mpz_set_si (z, mpz_cmpabs_ui (w, (l >= 0 ? l : -l)) == 0 ? 0 : l); + } } static void eval(mpz_ptr z, mpz_srcptr w, double d) {