void mpfx_manager::set_core(mpfx & n, mpq_manager<SYNCH> & m, mpq const & v) { if (m.is_int(v)) { set_core(n, m, v.numerator()); } else { allocate_if_needed(n); _scoped_numeral<mpz_manager<SYNCH> > tmp(m); n.m_sign = is_neg(n); m.mul2k(v.numerator(), 8 * sizeof(unsigned) * m_frac_part_sz, tmp); m.abs(tmp); if ((n.m_sign == 1) != m_to_plus_inf && !m.divides(v.denominator(), tmp)) { m.div(tmp, v.denominator(), tmp); m.inc(tmp); } else { m.div(tmp, v.denominator(), tmp); } m_tmp_digits.reset(); m.decompose(tmp, m_tmp_digits); unsigned sz = m_tmp_digits.size(); if (sz > m_total_sz) throw overflow_exception(); unsigned * w = words(n); ::copy(sz, m_tmp_digits.c_ptr(), m_total_sz, w); } SASSERT(check(n)); }
bool mpq_manager<SYNCH>::rat_lt(mpq const & a, mpq const & b) { mpz const & na = a.numerator(); mpz const & nb = b.numerator(); int sign_a = this->sign(na); int sign_b = this->sign(nb); if (sign_a < 0) { if (sign_b >= 0) return true; } else if (sign_a == 0) { if (sign_b > 0) return true; SASSERT(sign_b <= 0); return false; } else { SASSERT(sign_a > 0); if (sign_b <= 0) return false; } SASSERT((sign_a > 0 && sign_b > 0) || (sign_a < 0 && sign_b < 0)); mpz const & da = a.denominator(); mpz const & db = b.denominator(); if (SYNCH) { mpq tmp1; mpq tmp2; mul(na, db, tmp1); mul(nb, da, tmp2); bool r = lt(tmp1, tmp2); del(tmp1); del(tmp2); return r; } else { mul(na, db, m_lt_tmp1); mul(nb, da, m_lt_tmp2); return lt(m_lt_tmp1, m_lt_tmp2); } }