lean2/src/util/mpbq.cpp

56 lines
1 KiB
C++
Raw Normal View History

/*
Copyright (c) 2013 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Author: Leonardo de Moura
*/
#include "mpbq.h"
namespace lean {
void mpbq::normalize() {
if (m_k == 0)
return;
if (is_zero()) {
m_k = 0;
return;
}
unsigned k = m_num.power_of_two_multiple();
if (k > m_k)
k = m_k;
m_num.div2k(k);
m_k -= k;
}
int cmp(mpbq const & a, mpbq const & b) {
if (a.m_k == b.m_k)
return cmp(a.m_num, b.m_num);
else if (a.m_k < b.m_k) {
mpz tmp(a.m_num);
tmp.mul2k(b.m_k - a.m_k);
return cmp(tmp, b.m_num);
}
else {
lean_assert(a.m_k > b.m_k);
mpz tmp(b.m_num);
tmp.mul2k(a.m_k - b.m_k);
return cmp(a.m_num, tmp);
}
}
int cmp(mpbq const & a, mpz const & b) {
if (a.m_k == 0)
return cmp(a.m_num, b);
else {
mpz tmp(b);
tmp.mul2k(a.m_k);
return cmp(a.m_num, tmp);
}
}
}