mirror of https://github.com/CGAL/cgal
WIP: Replace CORE::BigInt and BigRat with the boost::mp classes. Just typedef
This commit is contained in:
parent
b32d1f0023
commit
e98692d8b8
|
|
@ -54,7 +54,7 @@ public:
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if 0
|
||||||
template <>
|
template <>
|
||||||
struct Get_arithmetic_kernel<CORE::BigInt>{
|
struct Get_arithmetic_kernel<CORE::BigInt>{
|
||||||
typedef CORE_arithmetic_kernel Arithmetic_kernel;
|
typedef CORE_arithmetic_kernel Arithmetic_kernel;
|
||||||
|
|
@ -63,6 +63,8 @@ template <>
|
||||||
struct Get_arithmetic_kernel<CORE::BigRat>{
|
struct Get_arithmetic_kernel<CORE::BigRat>{
|
||||||
typedef CORE_arithmetic_kernel Arithmetic_kernel;
|
typedef CORE_arithmetic_kernel Arithmetic_kernel;
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
struct Get_arithmetic_kernel<CORE::Expr>{
|
struct Get_arithmetic_kernel<CORE::Expr>{
|
||||||
typedef CORE_arithmetic_kernel Arithmetic_kernel;
|
typedef CORE_arithmetic_kernel Arithmetic_kernel;
|
||||||
|
|
@ -74,6 +76,7 @@ struct Get_arithmetic_kernel<CORE::BigFloat>{
|
||||||
|
|
||||||
} //namespace CGAL
|
} //namespace CGAL
|
||||||
|
|
||||||
|
|
||||||
#endif // CGAL_USE_CORE
|
#endif // CGAL_USE_CORE
|
||||||
|
|
||||||
#endif // CGAL_CORE_ARITHMETIC_KERNEL_H
|
#endif // CGAL_CORE_ARITHMETIC_KERNEL_H
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,7 @@ public:
|
||||||
/// constructor for <tt>const char* </tt>(default base = 10)
|
/// constructor for <tt>const char* </tt>(default base = 10)
|
||||||
BigFloat(const char* s) : RCBigFloat(new BigFloatRep(s)) {}
|
BigFloat(const char* s) : RCBigFloat(new BigFloatRep(s)) {}
|
||||||
/// constructor for <tt>std::string</tt>(default base = 10)
|
/// constructor for <tt>std::string</tt>(default base = 10)
|
||||||
BigFloat(const std::string& s) : RCBigFloat(new BigFloatRep(s)) {}
|
BigFloat(const std::string& s) : RCBigFloat(new BigFloatRep(s.c_str())) {}
|
||||||
|
|
||||||
/// constructor for <tt>int</tt> and <tt>long</tt>
|
/// constructor for <tt>int</tt> and <tt>long</tt>
|
||||||
// This is a hack because in Sturm, we need to approximate any
|
// This is a hack because in Sturm, we need to approximate any
|
||||||
|
|
@ -614,11 +614,23 @@ inline BigFloat gcd(const BigFloat& a, const BigFloat& b) {
|
||||||
//mpz_tdiv_qr(q.get_mp(), r.get_mp(), a.get_mp(), b.get_mp());
|
//mpz_tdiv_qr(q.get_mp(), r.get_mp(), a.get_mp(), b.get_mp());
|
||||||
//}//
|
//}//
|
||||||
|
|
||||||
|
/* AF
|
||||||
// constructor BigRat from BigFloat
|
// constructor BigRat from BigFloat
|
||||||
inline BigRat::BigRat(const BigFloat& f) : RCBigRat(new BigRatRep()){
|
inline BigRat::BigRat(const BigFloat& f) : RCBigRat(new BigRatRep()){
|
||||||
*this = f.BigRatValue();
|
*this = f.BigRatValue();
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
double doubleValue(const BigFloat& bf)
|
||||||
|
{
|
||||||
|
return bf.doubleValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
long longValue(const BigFloat& bf)
|
||||||
|
{
|
||||||
|
return bf.longValue();
|
||||||
|
}
|
||||||
|
|
||||||
} //namespace CORE
|
} //namespace CORE
|
||||||
|
|
||||||
#ifdef CGAL_HEADER_ONLY
|
#ifdef CGAL_HEADER_ONLY
|
||||||
|
|
|
||||||
|
|
@ -870,7 +870,7 @@ BigFloatRep::toDecimal(unsigned int width, bool Scientific) const {
|
||||||
M <<= e2; // M = x * 2^(e2)
|
M <<= e2; // M = x * 2^(e2)
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string decRep = M.get_str();
|
std::string decRep = M.convert_to<std::string>();
|
||||||
// Determine the "significant part" of this string, i.e. the part which
|
// Determine the "significant part" of this string, i.e. the part which
|
||||||
// is guaranteed to be correct in the presence of error,
|
// is guaranteed to be correct in the presence of error,
|
||||||
// except that the last digit which might be subject to +/- 1.
|
// except that the last digit which might be subject to +/- 1.
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,176 @@
|
||||||
#include <CGAL/CORE/MemoryPool.h>
|
#include <CGAL/CORE/MemoryPool.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
|
||||||
|
namespace CORE {
|
||||||
|
|
||||||
|
#ifdef CGAL_CORE_USE_GMP_BACKEND
|
||||||
|
typedef boost::multiprecision::mpz_int BigInt;
|
||||||
|
#else
|
||||||
|
typedef boost::multiprecision::cpp_int BigInt;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
inline int cmp(const BigInt& x, const BigInt& y) {
|
||||||
|
return x.compare(y);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int set_str(BigInt& a, const char* s) {
|
||||||
|
// AF makeCopy();
|
||||||
|
a = BigInt(s);
|
||||||
|
return 0; // should be -1 if not correct in the base (we ignore)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// longValue
|
||||||
|
inline long longValue(const BigInt& a) {
|
||||||
|
return a.convert_to<long>();;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// doubleValue
|
||||||
|
inline double doubleValue(const BigInt& a) {
|
||||||
|
return a.convert_to<double>();;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// isEven
|
||||||
|
inline bool isEven(const BigInt& z) {
|
||||||
|
return bit_test(z,0) == 0;
|
||||||
|
}
|
||||||
|
/// isOdd
|
||||||
|
inline bool isOdd(const BigInt& z) {
|
||||||
|
return bit_test(z,0) == 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool isDivisible(const BigInt& x, const BigInt& y) {
|
||||||
|
BigInt q, r;
|
||||||
|
divide_qr(x, y, q, r);
|
||||||
|
return r.is_zero();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool isDivisible(int x, int y) {
|
||||||
|
return x % y == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool isDivisible(long x, long y) {
|
||||||
|
return x % y == 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
/// get exponent of power 2
|
||||||
|
inline unsigned long getBinExpo(const BigInt& z) {
|
||||||
|
if (z.is_zero()) {
|
||||||
|
return (std::numeric_limits<unsigned long>::max)();
|
||||||
|
}
|
||||||
|
return lsb(abs(z));
|
||||||
|
}
|
||||||
|
|
||||||
|
// bit length
|
||||||
|
inline int bitLength(const BigInt& a) {
|
||||||
|
if (a.is_zero()) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return msb(abs(a))+1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// floorLg -- floor of log_2(a)
|
||||||
|
/** Convention: a=0, floorLg(a) returns -1.
|
||||||
|
* This makes sense for integer a.
|
||||||
|
*/
|
||||||
|
inline long floorLg(const BigInt& a) {
|
||||||
|
return (sign(a) == 0) ? (-1) : (bitLength(a)-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// div_rem
|
||||||
|
inline void div_rem(BigInt& q, BigInt& r, const BigInt& a, const BigInt& b) {
|
||||||
|
// AF q.makeCopy();
|
||||||
|
// AF r.makeCopy();
|
||||||
|
divide_qr(a, b, q, r);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// ulongValue
|
||||||
|
inline unsigned long ulongValue(const BigInt& a) {
|
||||||
|
assert(a >= BigInt(0));
|
||||||
|
return a.convert_to<unsigned long>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// exact div
|
||||||
|
inline void divexact(BigInt& z, const BigInt& x, const BigInt& y) {
|
||||||
|
// AF z.makeCopy();
|
||||||
|
BigInt r;
|
||||||
|
divide_qr(x, y, z, r ); // was void mpz_divexact (mpz_t q, const mpz_t n, const mpz_t d) Is this faster?
|
||||||
|
assert(r.is_zero());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Chee (1/12/2004) The definition of div_exact(x,y) next
|
||||||
|
// ensure that in Polynomials<NT> works with both NT=BigInt and NT=int:
|
||||||
|
inline BigInt div_exact(const BigInt& x, const BigInt& y) {
|
||||||
|
BigInt z; // precodition: isDivisible(x,y)
|
||||||
|
divexact(z, x, y); // z is set to x/y;
|
||||||
|
return z;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline int div_exact(int x, int y) {
|
||||||
|
return x/y; // precondition: isDivisible(x,y)
|
||||||
|
}
|
||||||
|
|
||||||
|
inline long div_exact(long x, long y) {
|
||||||
|
return x/y; // precondition: isDivisible(x,y)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// ceilLg -- ceiling of log_2(a) where a=BigInt, int or long
|
||||||
|
/** Convention: a=0, ceilLg(a) returns -1.
|
||||||
|
* This makes sense for integer a.
|
||||||
|
*/
|
||||||
|
inline long ceilLg(const BigInt& a) {
|
||||||
|
if (sign(a) == 0)
|
||||||
|
return -1;
|
||||||
|
unsigned long len = bitLength(a);
|
||||||
|
|
||||||
|
return (lsb(abs(a)) == len - 1) ? (len - 1) : len;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline long ceilLg(long a) { // need this for Polynomial<long>
|
||||||
|
return ceilLg(BigInt(a));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline long ceilLg(int a) { // need this for Polynomial<int>
|
||||||
|
return ceilLg(BigInt(a));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// negate
|
||||||
|
inline void negate(BigInt& a) {
|
||||||
|
// AF a.makeCopy();
|
||||||
|
a= - a;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// get exponent of power k
|
||||||
|
inline void getKaryExpo(const BigInt& z, BigInt& m, int& e, unsigned long uk) {
|
||||||
|
BigInt k(uk), q, r;
|
||||||
|
e = 0;
|
||||||
|
m = z;
|
||||||
|
// AF m.makeCopy();
|
||||||
|
for(;;) {
|
||||||
|
divide_qr(m, k, q, r);
|
||||||
|
if (!r.is_zero()) break;
|
||||||
|
m = q;
|
||||||
|
++e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void power(BigInt& c, const BigInt& a, unsigned long ul) {
|
||||||
|
// AF c.makeCopy();
|
||||||
|
c = pow(a, ul);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace CORE
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
|
||||||
namespace CORE {
|
namespace CORE {
|
||||||
|
|
||||||
#ifdef CGAL_CORE_USE_GMP_BACKEND
|
#ifdef CGAL_CORE_USE_GMP_BACKEND
|
||||||
|
|
@ -55,11 +225,7 @@ public:
|
||||||
: mp(c)
|
: mp(c)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
BigIntRep(const char* s, int base=0)
|
BigIntRep(const std::string& s)
|
||||||
: mp(s)
|
|
||||||
{ assert(base == 0); }
|
|
||||||
|
|
||||||
BigIntRep(const std::string& s, int base=0)
|
|
||||||
: mp(s)
|
: mp(s)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
@ -118,10 +284,9 @@ public:
|
||||||
BigInt(float x) : RCBigInt(new BigIntRep(x)) {}
|
BigInt(float x) : RCBigInt(new BigIntRep(x)) {}
|
||||||
/// constructor for <tt>double</tt>
|
/// constructor for <tt>double</tt>
|
||||||
BigInt(double x) : RCBigInt(new BigIntRep(x)) {}
|
BigInt(double x) : RCBigInt(new BigIntRep(x)) {}
|
||||||
/// constructor for <tt>const char*</tt> with base
|
|
||||||
BigInt(const char* s, int base=0) : RCBigInt(new BigIntRep(s, base)) {}
|
/// constructor for <tt>std::string</tt>
|
||||||
/// constructor for <tt>std::string</tt> with base
|
BigInt(const std::string& s) : RCBigInt(new BigIntRep(s)) {}
|
||||||
BigInt(const std::string& s, int base=0) : RCBigInt(new BigIntRep(s, base)) {}
|
|
||||||
|
|
||||||
/// constructor for <tt>mpz_srcptr</tt>
|
/// constructor for <tt>mpz_srcptr</tt>
|
||||||
// explicit BigInt(mpz_srcptr z) : RCBigInt(new BigIntRep(z)) {}
|
// explicit BigInt(mpz_srcptr z) : RCBigInt(new BigIntRep(z)) {}
|
||||||
|
|
@ -254,13 +419,13 @@ public:
|
||||||
/// \name String Conversion Functions
|
/// \name String Conversion Functions
|
||||||
//@{
|
//@{
|
||||||
/// set value from <tt>const char*</tt>
|
/// set value from <tt>const char*</tt>
|
||||||
int set_str(const char* s, int base = 0) {
|
int set_str(const char* s) {
|
||||||
makeCopy();
|
makeCopy();
|
||||||
get_mp() = Z(s);
|
get_mp() = Z(s);
|
||||||
return 0; // should be -1 if not correct in the base (we ignore)
|
return 0; // should be -1 if not correct in the base (we ignore)
|
||||||
}
|
}
|
||||||
/// convert to <tt>std::string</tt>
|
/// convert to <tt>std::string</tt>
|
||||||
std::string get_str(int base = 10) const {
|
std::string get_str() const {
|
||||||
return get_mp().convert_to<std::string>();
|
return get_mp().convert_to<std::string>();
|
||||||
}
|
}
|
||||||
//@}
|
//@}
|
||||||
|
|
@ -443,7 +608,7 @@ inline double doubleValue(const BigInt& a) {
|
||||||
|
|
||||||
void readFromFile(BigInt& z, std::istream& in, long maxLength = 0);
|
void readFromFile(BigInt& z, std::istream& in, long maxLength = 0);
|
||||||
/// write to file
|
/// write to file
|
||||||
void writeToFile(const BigInt& z, std::ostream& in, int base=10, int charsPerLine=80);
|
void writeToFile(const BigInt& z, std::ostream& in, int charsPerLine=80);
|
||||||
//@}
|
//@}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
@ -483,8 +648,8 @@ inline void getKaryExpo(const BigInt& z, BigInt& m, int& e, unsigned long uk) {
|
||||||
|
|
||||||
/// divisible(x,y) = "x | y"
|
/// divisible(x,y) = "x | y"
|
||||||
inline bool isDivisible(const BigInt& x, const BigInt& y) {
|
inline bool isDivisible(const BigInt& x, const BigInt& y) {
|
||||||
BigInt z, r;
|
BigInt q, r;
|
||||||
divide_qr(x.get_mp(), y.get_mp(), z.get_mp(), r.get_mp());
|
divide_qr(x.get_mp(), y.get_mp(), q.get_mp(), r.get_mp());
|
||||||
return r.get_mp().is_zero();
|
return r.get_mp().is_zero();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -538,7 +703,7 @@ inline void div_rem(BigInt& q, BigInt& r, const BigInt& a, const BigInt& b) {
|
||||||
/// power
|
/// power
|
||||||
inline void power(BigInt& c, const BigInt& a, unsigned long ul) {
|
inline void power(BigInt& c, const BigInt& a, unsigned long ul) {
|
||||||
c.makeCopy();
|
c.makeCopy();
|
||||||
c.get_mp() = pow(a.get_mp(), ul);
|
//c.get_mp() = pow(a.get_mp(), ul);
|
||||||
}
|
}
|
||||||
|
|
||||||
// pow
|
// pow
|
||||||
|
|
@ -553,7 +718,7 @@ inline int bitLength(const BigInt& a) {
|
||||||
if (a.get_mp().is_zero()) {
|
if (a.get_mp().is_zero()) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return msb(abs(a.get_mp()))+1; /// AF todo was mpz_sizeinbase(a.get_mp(), 2);
|
return msb(abs(a.get_mp()))+1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// floorLg -- floor of log_2(a)
|
/// floorLg -- floor of log_2(a)
|
||||||
|
|
@ -590,4 +755,6 @@ inline long ceilLg(int a) { // need this for Polynomial<int>
|
||||||
|
|
||||||
} //namespace CORE
|
} //namespace CORE
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // _CORE_BIGINT_H_
|
#endif // _CORE_BIGINT_H_
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,26 @@
|
||||||
|
|
||||||
#include <CGAL/CORE/BigInt.h>
|
#include <CGAL/CORE/BigInt.h>
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
namespace CORE {
|
||||||
|
#ifdef CGAL_CORE_USE_GMP_BACKEND
|
||||||
|
typedef boost::multiprecision::mpq_rational BigRat;
|
||||||
|
#else
|
||||||
|
typedef boost::multiprecision::cpp_rational BigRat;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/// BigIntValue
|
||||||
|
BigInt BigIntValue(const BigRat& br) {
|
||||||
|
BigInt r, rem;
|
||||||
|
divide_qr(numerator(br), denominator(br), r, rem);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace CORE
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
namespace CORE {
|
namespace CORE {
|
||||||
|
|
||||||
#ifdef CGAL_CORE_USE_GMP_BACKEND
|
#ifdef CGAL_CORE_USE_GMP_BACKEND
|
||||||
|
|
@ -203,6 +223,8 @@ public:
|
||||||
get_mp() /= rhs.get_mp();
|
get_mp() /= rhs.get_mp();
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
BigRat& operator <<=(unsigned long ul) {
|
BigRat& operator <<=(unsigned long ul) {
|
||||||
makeCopy();
|
makeCopy();
|
||||||
assert(false);
|
assert(false);
|
||||||
|
|
@ -215,6 +237,7 @@ public:
|
||||||
// AF no >> for Q get_mp() >>= ul;
|
// AF no >> for Q get_mp() >>= ul;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
/// \name div2, unary, increment, decrement operators
|
/// \name div2, unary, increment, decrement operators
|
||||||
|
|
@ -259,11 +282,15 @@ public:
|
||||||
/// \name Helper Functions
|
/// \name Helper Functions
|
||||||
//@{
|
//@{
|
||||||
/// Canonicalize
|
/// Canonicalize
|
||||||
|
|
||||||
|
/*
|
||||||
void canonicalize() {
|
void canonicalize() {
|
||||||
makeCopy();
|
makeCopy();
|
||||||
assert(false);
|
assert(false);
|
||||||
// AF todo mpq_canonicalize(get_mp());
|
// AF todo mpq_canonicalize(get_mp());
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
/// Has Exact Division
|
/// Has Exact Division
|
||||||
static bool hasExactDivision() {
|
static bool hasExactDivision() {
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -398,6 +425,8 @@ inline bool isDivisible(const BigRat& x, const BigRat& y) {
|
||||||
r.get_mp() = x.get_mp() / y.get_mp();
|
r.get_mp() = x.get_mp() / y.get_mp();
|
||||||
return isInteger(r);
|
return isInteger(r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
inline BigRat operator<<(const BigRat& a, unsigned long ul) {
|
inline BigRat operator<<(const BigRat& a, unsigned long ul) {
|
||||||
BigRat r;
|
BigRat r;
|
||||||
assert(false);
|
assert(false);
|
||||||
|
|
@ -410,7 +439,7 @@ inline BigRat operator>>(const BigRat& a, unsigned long ul) {
|
||||||
// AF todo no >> for Q r.get_mp() = a.get_mp() >> ul;
|
// AF todo no >> for Q r.get_mp() = a.get_mp() >> ul;
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
inline int cmp(const BigRat& x, const BigRat& y) {
|
inline int cmp(const BigRat& x, const BigRat& y) {
|
||||||
return x.get_mp().compare(y.get_mp());
|
return x.get_mp().compare(y.get_mp());
|
||||||
}
|
}
|
||||||
|
|
@ -477,4 +506,7 @@ inline BigInt BigIntValue(const BigRat& a) {
|
||||||
|
|
||||||
|
|
||||||
} //namespace CORE
|
} //namespace CORE
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // _CORE_BIGRAT_H_
|
#endif // _CORE_BIGRAT_H_
|
||||||
|
|
|
||||||
|
|
@ -164,6 +164,7 @@ void read_base_number(std::istream& in, BigInt& m, long length, long maxBits) {
|
||||||
|
|
||||||
// read base and compute digits
|
// read base and compute digits
|
||||||
if (c == '0') {
|
if (c == '0') {
|
||||||
|
assert(false); // no longer supported
|
||||||
in.get(c);
|
in.get(c);
|
||||||
if (c == 'b') {
|
if (c == 'b') {
|
||||||
base = 2;
|
base = 2;
|
||||||
|
|
@ -202,7 +203,7 @@ void read_base_number(std::istream& in, BigInt& m, long length, long maxBits) {
|
||||||
append_char(buffer, size, pos, '\0');
|
append_char(buffer, size, pos, '\0');
|
||||||
|
|
||||||
// convert string to bigint.
|
// convert string to bigint.
|
||||||
if (m.set_str(buffer, base) < 0)
|
if (set_str(m, buffer) < 0)
|
||||||
core_io_error_handler("CoreIO::read_from_file()","bad big number format.");
|
core_io_error_handler("CoreIO::read_from_file()","bad big number format.");
|
||||||
delete[] buffer;
|
delete[] buffer;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,8 @@
|
||||||
#define __PROMOTE_H__
|
#define __PROMOTE_H__
|
||||||
|
|
||||||
#include <CGAL/CORE/Impl.h>
|
#include <CGAL/CORE/Impl.h>
|
||||||
|
#include <CGAL/CORE/BigInt.h>
|
||||||
|
#include <CGAL/CORE/BigRat.h>
|
||||||
|
|
||||||
namespace CORE {
|
namespace CORE {
|
||||||
|
|
||||||
|
|
@ -119,9 +121,9 @@ class Promotion<T, T> {
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class BigInt;
|
//class BigInt;
|
||||||
class BigFloat;
|
class BigFloat;
|
||||||
class BigRat;
|
//class BigRat;
|
||||||
class Expr;
|
class Expr;
|
||||||
|
|
||||||
DEFINE_MAX_TYPE(long, BigInt, BigInt)
|
DEFINE_MAX_TYPE(long, BigInt, BigInt)
|
||||||
|
|
|
||||||
|
|
@ -277,7 +277,7 @@ const long halfLongMin = LONG_MIN /2;
|
||||||
struct _real_add {
|
struct _real_add {
|
||||||
template <class T>
|
template <class T>
|
||||||
static Real eval(const T& a, const T& b) {
|
static Real eval(const T& a, const T& b) {
|
||||||
return a+b;
|
return T(a+b);
|
||||||
}
|
}
|
||||||
// specialized for two long values
|
// specialized for two long values
|
||||||
static Real eval(long a, long b) {
|
static Real eval(long a, long b) {
|
||||||
|
|
@ -291,7 +291,7 @@ struct _real_add {
|
||||||
struct _real_sub {
|
struct _real_sub {
|
||||||
template <class T>
|
template <class T>
|
||||||
static Real eval(const T& a, const T& b) {
|
static Real eval(const T& a, const T& b) {
|
||||||
return a-b;
|
return T(a-b);
|
||||||
}
|
}
|
||||||
// specialized for two long values
|
// specialized for two long values
|
||||||
static Real eval(long a, long b) {
|
static Real eval(long a, long b) {
|
||||||
|
|
@ -305,7 +305,7 @@ struct _real_sub {
|
||||||
struct _real_mul {
|
struct _real_mul {
|
||||||
template <class T>
|
template <class T>
|
||||||
static Real eval(const T& a, const T& b) {
|
static Real eval(const T& a, const T& b) {
|
||||||
return a*b;
|
return T(a*b);
|
||||||
}
|
}
|
||||||
// specialized for two long values
|
// specialized for two long values
|
||||||
static Real eval(long a, long b) {
|
static Real eval(long a, long b) {
|
||||||
|
|
@ -478,7 +478,7 @@ inline Real sqrt(const Real& x) {
|
||||||
// unary minus operator
|
// unary minus operator
|
||||||
template <class T>
|
template <class T>
|
||||||
inline Real Realbase_for<T>::operator-() const {
|
inline Real Realbase_for<T>::operator-() const {
|
||||||
return -ker;
|
return -T(ker);
|
||||||
}
|
}
|
||||||
template <>
|
template <>
|
||||||
inline Real RealLong::operator-() const {
|
inline Real RealLong::operator-() const {
|
||||||
|
|
|
||||||
|
|
@ -92,10 +92,10 @@ public:
|
||||||
int ID() const;
|
int ID() const;
|
||||||
|
|
||||||
long longValue() const {
|
long longValue() const {
|
||||||
return ker.longValue();
|
return CORE::longValue(ker);
|
||||||
}
|
}
|
||||||
double doubleValue() const {
|
double doubleValue() const {
|
||||||
return ker.doubleValue();
|
return CORE::doubleValue(ker);
|
||||||
}
|
}
|
||||||
BigInt BigIntValue() const {
|
BigInt BigIntValue() const {
|
||||||
return BigInt(ker);
|
return BigInt(ker);
|
||||||
|
|
@ -231,7 +231,7 @@ inline BigInt RealBigInt::BigIntValue() const {
|
||||||
}
|
}
|
||||||
template<>
|
template<>
|
||||||
inline BigInt RealBigRat::BigIntValue() const {
|
inline BigInt RealBigRat::BigIntValue() const {
|
||||||
return ker.BigIntValue();
|
return CORE::BigIntValue(ker);
|
||||||
}
|
}
|
||||||
template<>
|
template<>
|
||||||
inline BigInt RealBigFloat::BigIntValue() const {
|
inline BigInt RealBigFloat::BigIntValue() const {
|
||||||
|
|
@ -500,11 +500,11 @@ inline unsigned long RealBigRat::height() const {
|
||||||
// toString()
|
// toString()
|
||||||
template<>
|
template<>
|
||||||
inline std::string RealBigInt::toString(long, bool) const {
|
inline std::string RealBigInt::toString(long, bool) const {
|
||||||
return ker.get_str();
|
return ker.convert_to<std::string>();
|
||||||
}
|
}
|
||||||
template<>
|
template<>
|
||||||
inline std::string RealBigRat::toString(long, bool) const {
|
inline std::string RealBigRat::toString(long, bool) const {
|
||||||
return ker.get_str();
|
return ker.convert_to<std::string>();
|
||||||
}
|
}
|
||||||
template<>
|
template<>
|
||||||
inline std::string RealBigFloat::toString(long prec, bool sci) const {
|
inline std::string RealBigFloat::toString(long prec, bool sci) const {
|
||||||
|
|
|
||||||
|
|
@ -181,10 +181,12 @@ public:
|
||||||
if(::CORE::bitLength(err.m()+err.err()) >= digits_long){
|
if(::CORE::bitLength(err.m()+err.err()) >= digits_long){
|
||||||
long shift = ::CORE::bitLength(err.m()) - digits_long + 1 ;
|
long shift = ::CORE::bitLength(err.m()) - digits_long + 1 ;
|
||||||
//std::cout << "shift " << shift<< std::endl;
|
//std::cout << "shift " << shift<< std::endl;
|
||||||
long new_err = ((err.m()+err.err()) >> shift).longValue()+1;
|
CORE::BigInt bi = (err.m() + err.err());
|
||||||
|
bi = bi >> shift;
|
||||||
|
long new_err = CORE::longValue(bi)+1;
|
||||||
err = CORE::BigFloat(0,new_err,0) * CORE::BigFloat::exp2(err.exp()*CORE::CHUNK_BIT+shift);
|
err = CORE::BigFloat(0,new_err,0) * CORE::BigFloat::exp2(err.exp()*CORE::CHUNK_BIT+shift);
|
||||||
}else{
|
}else{
|
||||||
err = CORE::BigFloat(0,err.m().longValue()+err.err(),err.exp());
|
err = CORE::BigFloat(0, CORE::longValue(err.m())+err.err(),err.exp());
|
||||||
}
|
}
|
||||||
//print_bf(err,"new_err");
|
//print_bf(err,"new_err");
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,6 @@
|
||||||
//
|
//
|
||||||
// Author(s) : Michael Hemmer <hemmer@mpi-inf.mpg.de>
|
// Author(s) : Michael Hemmer <hemmer@mpi-inf.mpg.de>
|
||||||
|
|
||||||
|
|
||||||
#ifndef CGAL_CORE_BIGINT_H
|
#ifndef CGAL_CORE_BIGINT_H
|
||||||
#define CGAL_CORE_BIGINT_H
|
#define CGAL_CORE_BIGINT_H
|
||||||
|
|
||||||
|
|
@ -24,6 +23,8 @@
|
||||||
#include <CGAL/Residue.h>
|
#include <CGAL/Residue.h>
|
||||||
#include <CGAL/Modular_traits.h>
|
#include <CGAL/Modular_traits.h>
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
|
||||||
namespace CGAL {
|
namespace CGAL {
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
@ -215,6 +216,7 @@ namespace Eigen {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <CGAL/enable_warnings.h>
|
#include <CGAL/enable_warnings.h>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,6 @@
|
||||||
//
|
//
|
||||||
// Author(s) : Michael Hemmer <hemmer@mpi-inf.mpg.de>
|
// Author(s) : Michael Hemmer <hemmer@mpi-inf.mpg.de>
|
||||||
|
|
||||||
|
|
||||||
#ifndef CGAL_CORE_BIGRAT_H
|
#ifndef CGAL_CORE_BIGRAT_H
|
||||||
#define CGAL_CORE_BIGRAT_H
|
#define CGAL_CORE_BIGRAT_H
|
||||||
|
|
||||||
|
|
@ -21,6 +20,8 @@
|
||||||
#include <CGAL/CORE_coercion_traits.h>
|
#include <CGAL/CORE_coercion_traits.h>
|
||||||
#include <CGAL/CORE_Expr.h> // used for To_interval-functor
|
#include <CGAL/CORE_Expr.h> // used for To_interval-functor
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
|
||||||
//#if defined(CGAL_CORE_BIGRAT_NUMER_DENOM_ARE_MEMBERS)
|
//#if defined(CGAL_CORE_BIGRAT_NUMER_DENOM_ARE_MEMBERS)
|
||||||
// #define CGAL_CORE_NUMERATOR(X) ((X).numerator())
|
// #define CGAL_CORE_NUMERATOR(X) ((X).numerator())
|
||||||
// #define CGAL_CORE_DENOMINATOR(X) ((X).denominator())
|
// #define CGAL_CORE_DENOMINATOR(X) ((X).denominator())
|
||||||
|
|
@ -252,6 +253,8 @@ namespace Eigen {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <CGAL/enable_warnings.h>
|
#include <CGAL/enable_warnings.h>
|
||||||
|
|
||||||
#endif // CGAL_CORE_BIGRAT_H
|
#endif // CGAL_CORE_BIGRAT_H
|
||||||
|
|
|
||||||
|
|
@ -24,13 +24,12 @@
|
||||||
|
|
||||||
#include <CGAL/CORE/CORE.h>
|
#include <CGAL/CORE/CORE.h>
|
||||||
|
|
||||||
//#include <NiX/Coercion_traits.h>
|
|
||||||
|
|
||||||
namespace CGAL {
|
namespace CGAL {
|
||||||
|
|
||||||
//CORE internal coercions:
|
//CORE internal coercions:
|
||||||
|
|
||||||
|
#if 0
|
||||||
// The following definitions reflect the interaction of the CORE number types
|
// The following definitions reflect the interaction of the CORE number types
|
||||||
// with the built in types,
|
// with the built in types,
|
||||||
// CORE BigInt:
|
// CORE BigInt:
|
||||||
|
|
@ -46,7 +45,7 @@ namespace CGAL {
|
||||||
CGAL_DEFINE_COERCION_TRAITS_FROM_TO(float ,::CORE::BigRat)
|
CGAL_DEFINE_COERCION_TRAITS_FROM_TO(float ,::CORE::BigRat)
|
||||||
CGAL_DEFINE_COERCION_TRAITS_FROM_TO(double ,::CORE::BigRat)
|
CGAL_DEFINE_COERCION_TRAITS_FROM_TO(double ,::CORE::BigRat)
|
||||||
CGAL_DEFINE_COERCION_TRAITS_FROM_TO(::CORE::BigInt,::CORE::BigRat)
|
CGAL_DEFINE_COERCION_TRAITS_FROM_TO(::CORE::BigInt,::CORE::BigRat)
|
||||||
|
#endif
|
||||||
// CORE Expr:
|
// CORE Expr:
|
||||||
CGAL_DEFINE_COERCION_TRAITS_FROM_TO(short ,::CORE::Expr)
|
CGAL_DEFINE_COERCION_TRAITS_FROM_TO(short ,::CORE::Expr)
|
||||||
CGAL_DEFINE_COERCION_TRAITS_FROM_TO(int ,::CORE::Expr)
|
CGAL_DEFINE_COERCION_TRAITS_FROM_TO(int ,::CORE::Expr)
|
||||||
|
|
@ -78,8 +77,8 @@ struct Coercion_traits<CORE::BigFloat , ::CORE::BigInt>{
|
||||||
CORE::BigFloat result;
|
CORE::BigFloat result;
|
||||||
result.approx(x,CORE::get_static_defRelPrec().toLong(),LONG_MAX);
|
result.approx(x,CORE::get_static_defRelPrec().toLong(),LONG_MAX);
|
||||||
// Do not use MakeFloorExact as it changes the Bigfloat
|
// Do not use MakeFloorExact as it changes the Bigfloat
|
||||||
CGAL_postcondition( ::CORE::BigRat(::CORE::BigFloat(result.m()-result.err(),0,result.exp())) <= x );
|
// AF CGAL_postcondition( ::CORE::BigRat(::CORE::BigFloat(result.m()-result.err(),0,result.exp())) <= x );
|
||||||
CGAL_postcondition( ::CORE::BigRat(::CORE::BigFloat(result.m()+result.err(),0,result.exp())) >= x );
|
// AF CGAL_postcondition( ::CORE::BigRat(::CORE::BigFloat(result.m()+result.err(),0,result.exp())) >= x );
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -98,8 +97,8 @@ struct Coercion_traits<CORE::BigFloat , ::CORE::BigRat>{
|
||||||
|
|
||||||
CORE::BigFloat result(x,CORE::get_static_defRelPrec().toLong(),LONG_MAX);
|
CORE::BigFloat result(x,CORE::get_static_defRelPrec().toLong(),LONG_MAX);
|
||||||
// Do not use MakeFloorExact as it changes the Bigfloat
|
// Do not use MakeFloorExact as it changes the Bigfloat
|
||||||
CGAL_postcondition( ::CORE::BigRat(::CORE::BigFloat(result.m()-result.err(),0,result.exp())) <= x );
|
// AF CGAL_postcondition( ::CORE::BigRat(::CORE::BigFloat(result.m()-result.err(),0,result.exp())) <= x );
|
||||||
CGAL_postcondition( ::CORE::BigRat(::CORE::BigFloat(result.m()+result.err(),0,result.exp())) >= x );
|
// AF CGAL_postcondition( ::CORE::BigRat(::CORE::BigFloat(result.m()+result.err(),0,result.exp())) >= x );
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -117,8 +116,8 @@ struct Coercion_traits<CORE::BigFloat , ::CORE::Expr>{
|
||||||
Type operator()(const ::CORE::Expr x) const {
|
Type operator()(const ::CORE::Expr x) const {
|
||||||
CORE::BigFloat result(x, CORE::get_static_defRelPrec().toLong(),LONG_MAX);
|
CORE::BigFloat result(x, CORE::get_static_defRelPrec().toLong(),LONG_MAX);
|
||||||
// Do not use MakeFloorExact as it changes the Bigfloat
|
// Do not use MakeFloorExact as it changes the Bigfloat
|
||||||
CGAL_postcondition( ::CORE::BigRat(::CORE::BigFloat(result.m()-result.err(),0,result.exp())) <= x );
|
// AF CGAL_postcondition( ::CORE::BigRat(::CORE::BigFloat(result.m()-result.err(),0,result.exp())) <= x );
|
||||||
CGAL_postcondition( ::CORE::BigRat(::CORE::BigFloat(result.m()+result.err(),0,result.exp())) >= x );
|
// AF CGAL_postcondition( ::CORE::BigRat(::CORE::BigFloat(result.m()+result.err(),0,result.exp())) >= x );
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -150,6 +149,8 @@ template <> struct Coercion_traits< ::CORE::Expr, CORE::BigFloat >
|
||||||
|
|
||||||
} //namespace CGAL
|
} //namespace CGAL
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif // CGAL_USE_CORE
|
#endif // CGAL_USE_CORE
|
||||||
#endif //CGAL_CORE_COERCION_TRAITS_H 1
|
#endif //CGAL_CORE_COERCION_TRAITS_H 1
|
||||||
//EOF
|
//EOF
|
||||||
|
|
|
||||||
|
|
@ -57,6 +57,24 @@
|
||||||
// TODO: work on the coercions (end of the file)
|
// TODO: work on the coercions (end of the file)
|
||||||
|
|
||||||
namespace CGAL {
|
namespace CGAL {
|
||||||
|
template<>
|
||||||
|
struct Needs_parens_as_product<typename boost::multiprecision::cpp_int>{
|
||||||
|
bool operator()(const typename boost::multiprecision::cpp_int& x){
|
||||||
|
return x < 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct Needs_parens_as_product<typename boost::multiprecision::cpp_rational>{
|
||||||
|
bool operator()(const typename boost::multiprecision::cpp_rational& x){
|
||||||
|
if (denominator(x) != 1 )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return needs_parens_as_product(numerator(x)) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
// Algebraic_structure_traits
|
// Algebraic_structure_traits
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,7 @@ void test_io(){
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
CGAL::IO::set_pretty_mode(ss);
|
CGAL::IO::set_pretty_mode(ss);
|
||||||
ss << CGAL::IO::oformat(NT(1), CGAL::Parens_as_product_tag());
|
ss << CGAL::IO::oformat(NT(1), CGAL::Parens_as_product_tag());
|
||||||
|
std::cout << ss.str() << std::endl;
|
||||||
assert( ss.str() == "1");
|
assert( ss.str() == "1");
|
||||||
}{
|
}{
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
|
|
|
||||||
|
|
@ -19,18 +19,18 @@ void test_io(){
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
CGAL::IO::set_ascii_mode(ss);
|
CGAL::IO::set_ascii_mode(ss);
|
||||||
ss << CGAL::IO::oformat(NT(1));
|
ss << CGAL::IO::oformat(NT(1));
|
||||||
//std::cout << ss.str()<<std::endl;
|
std::cout << ss.str()<<std::endl;
|
||||||
assert( ss.str() == "1/1");
|
assert( ss.str() == "1");
|
||||||
}{
|
}{
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
CGAL::IO::set_ascii_mode(ss);
|
CGAL::IO::set_ascii_mode(ss);
|
||||||
ss << CGAL::IO::oformat(NT(0));
|
ss << CGAL::IO::oformat(NT(0));
|
||||||
assert( ss.str() == "0/1");
|
assert( ss.str() == "0");
|
||||||
}{
|
}{
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
CGAL::IO::set_ascii_mode(ss);
|
CGAL::IO::set_ascii_mode(ss);
|
||||||
ss << CGAL::IO::oformat(NT(-1));
|
ss << CGAL::IO::oformat(NT(-1));
|
||||||
assert( ss.str() == "-1/1");
|
assert( ss.str() == "-1");
|
||||||
}
|
}
|
||||||
//MODE PRETTY
|
//MODE PRETTY
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue