New file for construct_binary functions, containing the new general function.

This commit is contained in:
Sebastian Limbach 2007-03-15 13:04:32 +00:00
parent 7cf9fa0a94
commit 9a6fa39923
2 changed files with 133 additions and 0 deletions

1
.gitattributes vendored
View File

@ -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

View File

@ -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