carl  24.04
Computer ARithmetic Library
cln_gmp.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <carl-common/config.h>
4 
5 #ifdef USE_CLN_NUMBERS
6 namespace carl {
7 
8  template<>
9  inline cln::cl_I convert<cln::cl_I, cln::cl_I>(const cln::cl_I& n) {
10  return n;
11  };
12 
13  template<>
14  inline cln::cl_RA convert<cln::cl_I, cln::cl_RA>(const cln::cl_I& n) {
15  return n;
16  };
17 
18  template<>
19  inline cln::cl_I convert<cln::cl_RA, cln::cl_I>(const cln::cl_RA& n) {
20  assert(cln::denominator(n) == 1);
21  return cln::numerator(n);
22  };
23 
24  template<>
25  inline cln::cl_RA convert<cln::cl_RA, cln::cl_RA>(const cln::cl_RA& n) {
26  return n;
27  }
28 
29  template<>
30  inline mpz_class convert<cln::cl_I, mpz_class>(const cln::cl_I& n) {
31  if( n <= std::numeric_limits<sint>::max() && n >= std::numeric_limits<sint>::min() )
32  {
33  return mpz_class(static_cast<signed long>(carl::to_int<sint>(n)));
34  }
35 
36  std::stringstream s;
37  s << n;
38  mpz_class result = parse<mpz_class>(s.str());
39  return result;
40  }
41 
42  template<>
43  inline mpq_class convert<cln::cl_RA, mpq_class>(const cln::cl_RA& n) {
44  cln::cl_I den = carl::get_denom(n);
45  if( den <= std::numeric_limits<sint>::max() && den >= std::numeric_limits<sint>::min() )
46  {
47  cln::cl_I num = carl::get_num(n);
48  if( num <= std::numeric_limits<sint>::max() && num >= std::numeric_limits<sint>::min() )
49  {
50  return mpq_class(static_cast<signed long>(carl::to_int<sint>(num)))/mpq_class(static_cast<signed long>(carl::to_int<sint>(den)));
51  }
52  }
53  std::stringstream s;
54  s << n;
55  mpq_class result = parse<mpq_class>(s.str());
56  return result;
57  }
58 
59  template<>
60  inline mpz_class convert<mpz_class, mpz_class>(const mpz_class& n) {
61  return n;
62  }
63 
64  template<>
65  inline mpq_class convert<mpq_class, mpq_class>(const mpq_class& n) {
66  return n;
67  }
68 
69  template<>
70  inline cln::cl_I convert<mpz_class, cln::cl_I>(const mpz_class& n) {
71  if( n <= std::numeric_limits<int>::max() && n >= std::numeric_limits<int>::min() )
72  {
73  return cln::cl_I(carl::to_int<sint>(n));
74  }
75  std::stringstream s;
76  s << n;
77  cln::cl_I result = parse<cln::cl_I>(s.str());
78  return result;
79  }
80 
81  template<>
82  inline cln::cl_RA convert<mpq_class, cln::cl_RA>(const mpq_class& n) {
83  mpz_class den = carl::get_denom(n);
84  if( den <= std::numeric_limits<int>::max() && den >= std::numeric_limits<int>::min() )
85  {
86  mpz_class num = carl::get_num(n);
87  if( num <= std::numeric_limits<int>::max() && num >= std::numeric_limits<int>::min() )
88  {
89  return cln::cl_RA(carl::to_int<sint>(num))/cln::cl_RA(carl::to_int<sint>(den));
90  }
91  }
92  std::stringstream s;
93  s << n;
94  cln::cl_RA result = parse<cln::cl_RA>(s.str());
95  return result;
96  }
97 
98 }
99 #endif
carl is the main namespace for the library.
cln::cl_I get_num(const cln::cl_RA &n)
Extract the numerator from a fraction.
Definition: operations.h:60
cln::cl_I get_denom(const cln::cl_RA &n)
Extract the denominator from a fraction.
Definition: operations.h:69
mpz_class parse< mpz_class >(const std::string &n)
Definition: operations.cpp:150
sint to_int< sint >(const cln::cl_I &n)
Definition: operations.h:131
mpq_class parse< mpq_class >(const std::string &n)
Definition: operations.cpp:163