Пример #1
0
void mpbq_manager::add(mpbq const & a, mpbq const & b, mpbq & r) {
#ifdef MPBQ_DEBUG
    rational _a = to_rational(a);
    rational _b = to_rational(b);
#endif
    if (a.m_k == b.m_k) {
        m_manager.add(a.m_num, b.m_num, r.m_num);
        r.m_k = a.m_k;
    }
    else if (a.m_k < b.m_k) {
        m_manager.mul2k(a.m_num, b.m_k - a.m_k, m_tmp);
        m_manager.add(b.m_num, m_tmp, r.m_num);
        r.m_k = b.m_k;
    }
    else {
        SASSERT(a.m_k > b.m_k);
        m_manager.mul2k(b.m_num, a.m_k - b.m_k, m_tmp);
        m_manager.add(a.m_num, m_tmp, r.m_num);
        r.m_k = a.m_k;
    }
    normalize(r);
#ifdef MPBQ_DEBUG
    rational _r = to_rational(r);
    SASSERT(_a + _b == _r);
#endif 
}
Пример #2
0
rational pb_util::get_k(func_decl *a) const {
    parameter const& p = a->get_parameter(0);
    if (is_at_most_k(a) || is_at_least_k(a)) {
        return to_rational(p);
    }
    else {
        SASSERT(is_le(a) || is_ge(a) || is_eq(a));
        return to_rational(p);
    }
}
Пример #3
0
rational pb_util::get_coeff(func_decl* a, unsigned index) const {
    if (is_at_most_k(a) || is_at_least_k(a)) {
        return rational::one();
    }
    SASSERT(is_le(a) || is_ge(a) || is_eq(a));
    SASSERT(1 + index < a->get_num_parameters());
    return to_rational(a->get_parameter(index + 1));
}
Пример #4
0
void mpbq_manager::add(mpbq const & a, mpz const & b, mpbq & r) {
#ifdef MPBQ_DEBUG
    rational _a = to_rational(a);
    rational _b(b);
#endif
    if (a.m_k == 0) {
        m_manager.add(a.m_num, b, r.m_num);
        r.m_k = a.m_k;
    }
    else {
        m_manager.mul2k(b, a.m_k, m_tmp);
        m_manager.add(a.m_num, m_tmp, r.m_num);
        r.m_k = a.m_k;
    }
    normalize(r);
#ifdef MPBQ_DEBUG
    rational _r = to_rational(r);
    TRACE("mpbq_bug", tout << "add a: " << _a << ", b: " << _b << ", r: " << _r << ", expected: " << (_a + _b) << "\n";);
Пример #5
0
void mpbq_manager::normalize(mpbq & a) {
    if (a.m_k == 0)
        return;
    if (m_manager.is_zero(a.m_num)) {
        a.m_k = 0;
        return;
    }
#ifdef MPBQ_DEBUG
    rational r = to_rational(a);
#endif
    unsigned k = m_manager.power_of_two_multiple(a.m_num);
    if (k > a.m_k)
        k = a.m_k;
    m_manager.machine_div2k(a.m_num, k);
    a.m_k -= k;
#ifdef MPBQ_DEBUG
    rational new_r = to_rational(a);
    SASSERT(r == new_r);
#endif
}