Index: numbers-c.c =================================================================== --- numbers-c.c (revision 9881) +++ numbers-c.c (working copy) @@ -55,10 +55,23 @@ } +static double +mpq_get_d_accurately(mpq_t rat) +{ + mpz_t *num, *den; + num = mpq_numref(rat); + den = mpq_denref(rat); + if (mpz_fits_slong_p(*num) && mpz_fits_slong_p(*den)) { + return (double) (mpz_get_d(*num) / mpz_get_d(*den)); + } else { + return mpq_get_d(rat); + } +} + static C_word rat_to_flo(C_word **p, C_word n, C_word rat) { - return C_flonum(p, mpq_get_d(rat_of(rat))); + return C_flonum(p, mpq_get_d_accurately(rat_of(rat))); } @@ -1189,7 +1202,7 @@ return C_mk_bool(C_flonum_magnitude(x) == C_flonum_magnitude(y)); case C_fix(RAT): - return C_mk_bool(C_flonum_magnitude(x) == mpq_get_d(rat_of(y))); + return C_mk_bool(C_flonum_magnitude(x) == mpq_get_d_accurately(rat_of(y))); default: return C_SCHEME_FALSE; } @@ -1210,7 +1223,7 @@ case C_fix(RAT): switch(ty) { case C_fix(FLO): - return C_mk_bool(mpq_get_d(rx) == C_flonum_magnitude(y)); + return C_mk_bool(mpq_get_d_accurately(rx) == C_flonum_magnitude(y)); case C_fix(RAT): { defrat(ry, y);