3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2026-02-26 18:15:37 +00:00
z3/src/util/rational.cpp
Nikolaj Bjorner b19f94ae5b make include paths uniformly use path relative to src. #534
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
2017-07-31 13:24:11 -07:00

85 lines
1.8 KiB
C++

/*++
Copyright (c) 2006 Microsoft Corporation
Module Name:
rational.cpp
Abstract:
Rational numbers
Author:
Leonardo de Moura (leonardo) 2006-09-18.
Revision History:
--*/
#include<sstream>
#include "util/util.h"
#include "util/rational.h"
#ifdef _WINDOWS
#include<strsafe.h>
#endif
synch_mpq_manager * rational::g_mpq_manager = 0;
rational rational::m_zero;
rational rational::m_one;
rational rational::m_minus_one;
vector<rational> rational::m_powers_of_two;
static void mk_power_up_to(vector<rational> & pws, unsigned n) {
if (pws.empty()) {
pws.push_back(rational::one());
}
unsigned sz = pws.size();
rational curr = pws[sz - 1];
rational two(2);
for (unsigned i = sz; i <= n; i++) {
curr *= two;
pws.push_back(curr);
}
}
rational rational::power_of_two(unsigned k) {
rational result;
#pragma omp critical (powers_of_two)
{
if (k >= m_powers_of_two.size())
mk_power_up_to(m_powers_of_two, k+1);
result = m_powers_of_two[k];
}
return result;
}
// in inf_rational.cpp
void initialize_inf_rational();
void finalize_inf_rational();
// in inf_int_rational.cpp
void initialize_inf_int_rational();
void finalize_inf_int_rational();
void rational::initialize() {
if (!g_mpq_manager) {
g_mpq_manager = alloc(synch_mpq_manager);
m().set(m_zero.m_val, 0);
m().set(m_one.m_val, 1);
m().set(m_minus_one.m_val, -1);
initialize_inf_rational();
initialize_inf_int_rational();
}
}
void rational::finalize() {
finalize_inf_rational();
finalize_inf_int_rational();
m_powers_of_two.finalize();
m_zero.~rational();
m_one.~rational();
m_minus_one.~rational();
dealloc(g_mpq_manager);
g_mpq_manager = 0;
}