cprover
rational.cpp
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module: Rational Numbers
4 
5 Author: Daniel Kroening, kroening@kroening.com
6 
7 \*******************************************************************/
8 
11 
12 #include "rational.h"
13 
14 #include <algorithm>
15 #include <ostream>
16 
18 {
19  rationalt tmp(n);
20  same_denominator(tmp);
21  numerator+=tmp.numerator;
22  normalize();
23  return *this;
24 }
25 
27 {
28  rationalt tmp(n);
29  same_denominator(tmp);
30  numerator-=tmp.numerator;
31  normalize();
32  return *this;
33 }
34 
36 {
37  numerator.negate();
38  return *this;
39 }
40 
42 {
45  normalize();
46  return *this;
47 }
48 
50 {
51  assert(!n.numerator.is_zero());
54  normalize();
55  return *this;
56 }
57 
59 {
60  // first do sign
61 
62  if(denominator.is_negative())
63  {
64  denominator.negate();
65  numerator.negate();
66  }
67 
68  // divide by gcd
69 
70  mp_integer _gcd=gcd(denominator, numerator);
71  if(_gcd!=1 && !_gcd.is_zero())
72  {
73  denominator/=_gcd;
74  numerator/=_gcd;
75  }
76 }
77 
79 {
81  return;
82 
85 
87  denominator=t;
88  n.denominator=t;
89 }
90 
92 {
93  assert(numerator!=0);
94  std::swap(numerator, denominator);
95 }
96 
98 {
99  rationalt tmp(n);
100  tmp.invert();
101  return tmp;
102 }
103 
104 std::ostream &operator<<(std::ostream &out, const rationalt &a)
105 {
106  std::string d=integer2string(a.get_numerator());
107  if(a.get_denominator()!=1)
108  d+="/"+integer2string(a.get_denominator());
109  return out << d;
110 }
rationalt & operator-=(const rationalt &n)
Definition: rational.cpp:26
BigInt mp_integer
Definition: mp_arith.h:19
void normalize()
Definition: rational.cpp:58
const std::string integer2string(const mp_integer &n, unsigned base)
Definition: mp_arith.cpp:104
void same_denominator(rationalt &n)
Definition: rational.cpp:78
const mp_integer & get_numerator() const
Definition: rational.h:90
rationalt & operator+=(const rationalt &n)
Definition: rational.cpp:17
rationalt & operator*=(const rationalt &n)
Definition: rational.cpp:41
rationalt & operator-()
Definition: rational.cpp:35
mp_integer denominator
Definition: rational.h:24
const mp_integer & get_denominator() const
Definition: rational.h:95
rationalt & operator/=(const rationalt &n)
Definition: rational.cpp:49
mp_integer numerator
Definition: rational.h:23
rationalt inverse(const rationalt &n)
Definition: rational.cpp:97
std::ostream & operator<<(std::ostream &out, const rationalt &a)
Definition: rational.cpp:104
void invert()
Definition: rational.cpp:91