mirror of https://github.com/CGAL/cgal
New file for construct_binary functions, containing the new general function.
This commit is contained in:
parent
7cf9fa0a94
commit
9a6fa39923
|
|
@ -27,6 +27,7 @@ Algebraic_kernel_GBRS/test/Gbrs_polynomial/parsers.h -text
|
|||
Algebraic_kernel_d/doc_tex/Algebraic_kernel_d_ref/figures/cpvl.eps -text svneol=unset#application/postscript
|
||||
Algebraic_kernel_d/doc_tex/Algebraic_kernel_d_ref/figures/cpvl.fig -text svneol=unset#application/octet-stream
|
||||
Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/Descartes.h -text
|
||||
Algebraic_kernel_d/include/CGAL/Algebraic_kernel_d/construct_binary.h -text
|
||||
Algebraic_kernel_d/test/Algebraic_kernel_d/Descartes.cpp -text
|
||||
Algebraic_kernel_d/test/Algebraic_kernel_d/include/CGAL/_test_real_root_isolator.h -text
|
||||
Alpha_shapes_2/demo/Alpha_shapes_2/alpha_shapes_2.vcproj eol=crlf
|
||||
|
|
|
|||
|
|
@ -0,0 +1,132 @@
|
|||
// TODO: Add licence
|
||||
//
|
||||
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
//
|
||||
// $URL:$
|
||||
// $Id: $
|
||||
//
|
||||
//
|
||||
// Author(s) :
|
||||
//
|
||||
// ============================================================================
|
||||
|
||||
#ifndef CGAL_ALGEBRAIC_KERNEL_D_CONSTRUCT_BINARY_H
|
||||
#define CGAL_ALGEBRAIC_KERNEL_D_CONSTRUCT_BINARY_H
|
||||
|
||||
#include <CGAL/basic.h>
|
||||
#include <CGAL/Polynomial/ipower.h>
|
||||
|
||||
#ifdef CGAL_USE_LEDA
|
||||
#include <CGAL/leda_integer.h>
|
||||
#include <CGAL/leda_rational.h>
|
||||
#endif
|
||||
#ifdef CGAL_USE_CORE
|
||||
#include <CGAL/CORE_BigInt.h>
|
||||
#include <CGAL/CORE_BigRat.h>
|
||||
#endif
|
||||
|
||||
#include <limits>
|
||||
|
||||
CGAL_BEGIN_NAMESPACE
|
||||
|
||||
namespace CGALi {
|
||||
|
||||
// Generic construct_binary function, using ipower
|
||||
template< class Integer >
|
||||
inline void construct_binary( const Integer& e, Integer& x ) {
|
||||
CGAL_precondition( e >= 0 );
|
||||
Integer exponent(e);
|
||||
x = Integer(1);
|
||||
|
||||
const Integer max_ipower = (exponent > Integer(std::numeric_limits<int>::max())) ?
|
||||
INTERN_POLYNOMIAL::ipower( Integer(2), std::numeric_limits<int>::max() ) :
|
||||
Integer(0);
|
||||
|
||||
while( exponent > Integer(std::numeric_limits<int>::max()) ) {
|
||||
x *= max_ipower;
|
||||
exponent -= Integer(std::numeric_limits<int>::max());
|
||||
}
|
||||
|
||||
x *= INTERN_POLYNOMIAL::ipower( Integer(2), (int)CGAL::to_double(exponent) );
|
||||
}
|
||||
|
||||
template< class Integer, class Rational >
|
||||
inline void construct_binary( const Integer& m, const Integer& e, Rational& x ) {
|
||||
Integer den(1), num;
|
||||
if(e>0) {
|
||||
construct_binary( e, num );
|
||||
num *= m;
|
||||
}
|
||||
else {
|
||||
num = m;
|
||||
construct_binary( -e, den );
|
||||
}
|
||||
x = Rational(num, den);
|
||||
}
|
||||
|
||||
// Specialization for LEDA
|
||||
|
||||
#ifdef CGAL_USE_LEDA
|
||||
|
||||
// Constructs 2^e from an integer e. Needed in Descartes
|
||||
inline void construct_binary(const ::leda::integer& e, ::leda::integer& x) {
|
||||
typedef ::leda::integer Integer;
|
||||
x = Integer(1) << e.to_long();
|
||||
}
|
||||
|
||||
// Constructs m*2^e from two integers m,e. Needed in Descartes
|
||||
inline void construct_binary(const ::leda::integer& m, const ::leda::integer& e,
|
||||
::leda::rational& x) {
|
||||
|
||||
typedef ::leda::integer Integer;
|
||||
typedef ::leda::rational Rational;
|
||||
|
||||
Integer den(1);
|
||||
Integer num(m);
|
||||
if(e>0) {
|
||||
num <<= e.to_long();
|
||||
}
|
||||
else {
|
||||
den <<= (-e).to_long();
|
||||
}
|
||||
x = Rational(num, den);
|
||||
}
|
||||
|
||||
#endif // CGAL_USE_LEDA
|
||||
|
||||
// Specialization for CORE
|
||||
|
||||
#ifdef CGAL_USE_CORE
|
||||
|
||||
// Constructs 2^e from an integer e. Needed in Descartes
|
||||
inline void construct_binary(const ::CORE::BigInt& e, ::CORE::BigInt& x) {
|
||||
typedef ::CORE::BigInt Integer;
|
||||
x = Integer(1) << ::CORE::ulongValue(e);
|
||||
}
|
||||
|
||||
// Constructs m*2^e from two integers m,e. Needed in Descardes
|
||||
inline void construct_binary(const ::CORE::BigInt& m, const ::CORE::BigInt& e,
|
||||
::CORE::BigRat& x) {
|
||||
typedef ::CORE::BigInt Integer;
|
||||
typedef ::CORE::BigRat Rational;
|
||||
|
||||
Integer den(1);
|
||||
Integer num(m);
|
||||
if(e>0) {
|
||||
num <<= ::CORE::ulongValue(e);
|
||||
}
|
||||
else {
|
||||
den <<= ::CORE::ulongValue(-e);
|
||||
}
|
||||
x = Rational(num, den);
|
||||
}
|
||||
|
||||
#endif // CGAL_USE_CORE
|
||||
|
||||
} // namespace CGALi
|
||||
|
||||
CGAL_END_NAMESPACE
|
||||
|
||||
|
||||
#endif // CGAL_ALGEBRAIC_KERNEL_D_CONSTRUCT_BINARY_H
|
||||
Loading…
Reference in New Issue