Index: set_q.c =================================================================== RCS file: /users/spaces/logiciels/mpfr/cvs/msb/set_q.c,v retrieving revision 1.17 retrieving revision 1.19 diff -c -r1.17 -r1.19 *** set_q.c 2002/04/15 13:26:41 1.17 --- set_q.c 2002/06/14 13:14:34 1.19 *************** *** 32,54 **** mpz_srcptr num, den; mpfr_t n, d; int inexact; ! MPFR_CLEAR_FLAGS(f); num = mpq_numref (q); if (mpz_cmp_ui (num, 0) == 0) { ! MPFR_SET_ZERO(f); ! MPFR_SET_POS(f); ! MPFR_RET(0); } ! den = mpq_denref(q); ! mpfr_init2 (n, mpz_sizeinbase(num, 2)); ! mpfr_set_z (n, num, GMP_RNDZ); /* result is exact */ ! mpfr_init2 (d, mpz_sizeinbase(den, 2)); ! mpfr_set_z (d, den, GMP_RNDZ); /* result is exact */ inexact = mpfr_div (f, n, d, rnd); mpfr_clear (n); mpfr_clear (d); ! MPFR_RET(inexact); } --- 32,75 ---- mpz_srcptr num, den; mpfr_t n, d; int inexact; + mp_prec_t prec; ! MPFR_CLEAR_FLAGS (f); num = mpq_numref (q); if (mpz_cmp_ui (num, 0) == 0) { ! MPFR_SET_ZERO (f); ! MPFR_SET_POS (f); ! MPFR_RET (0); } ! den = mpq_denref (q); ! mpfr_save_emin_emax (); ! prec = mpz_sizeinbase (num, 2); ! if (prec < MPFR_PREC_MIN) ! prec = MPFR_PREC_MIN; ! mpfr_init2 (n, prec); ! if (mpfr_set_z (n, num, GMP_RNDZ)) /* result is exact unless overflow */ ! { ! mpfr_clear (n); ! mpfr_restore_emin_emax (); ! MPFR_SET_NAN (f); ! MPFR_RET_NAN; ! } ! prec = mpz_sizeinbase(den, 2); ! if (prec < MPFR_PREC_MIN) ! prec = MPFR_PREC_MIN; ! mpfr_init2 (d, prec); ! if (mpfr_set_z (d, den, GMP_RNDZ)) /* result is exact unless overflow */ ! { ! mpfr_clear (d); ! mpfr_clear (n); ! mpfr_restore_emin_emax (); ! MPFR_SET_NAN (f); ! MPFR_RET_NAN; ! } inexact = mpfr_div (f, n, d, rnd); mpfr_clear (n); mpfr_clear (d); ! MPFR_RESTORE_RET (inexact, f, rnd); }