CBMC
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
rational.cpp
Go to the documentation of this file.
1/*******************************************************************\
2
3Module: Rational Numbers
4
5Author: Daniel Kroening, kroening@kroening.com
6
7\*******************************************************************/
8
11
12#include "rational.h"
13
14#include <ostream>
15
16#include "invariant.h"
17
19{
22 numerator+=tmp.numerator;
23 normalize();
24 return *this;
25}
26
28{
31 numerator-=tmp.numerator;
32 normalize();
33 return *this;
34}
35
37{
38 numerator.negate();
39 return *this;
40}
41
43{
44 numerator*=n.numerator;
45 denominator*=n.denominator;
46 normalize();
47 return *this;
48}
49
51{
52 PRECONDITION(!n.numerator.is_zero());
53 numerator*=n.denominator;
54 denominator*=n.numerator;
55 normalize();
56 return *this;
57}
58
60{
61 // first do sign
62
63 if(denominator.is_negative())
64 {
65 denominator.negate();
66 numerator.negate();
67 }
68
69 // divide by gcd
70
72 if(_gcd!=1 && !_gcd.is_zero())
73 {
76 }
77}
78
80{
81 if(denominator==n.denominator)
82 return;
83
84 numerator*=n.denominator;
85 n.numerator*=denominator;
86
87 mp_integer t=denominator*n.denominator;
89 n.denominator=t;
90}
91
93{
95 std::swap(numerator, denominator);
96}
97
99{
100 rationalt tmp(n);
101 tmp.invert();
102 return tmp;
103}
104
105std::ostream &operator<<(std::ostream &out, const rationalt &a)
106{
107 std::string d=integer2string(a.get_numerator());
108 if(a.get_denominator()!=1)
109 d+="/"+integer2string(a.get_denominator());
110 return out << d;
111}
ait supplies three of the four components needed: an abstract interpreter (in this case handling func...
Definition ai.h:562
rationalt & operator/=(const rationalt &n)
Definition rational.cpp:50
rationalt & operator+=(const rationalt &n)
Definition rational.cpp:18
void same_denominator(rationalt &n)
Definition rational.cpp:79
rationalt & operator-=(const rationalt &n)
Definition rational.cpp:27
void normalize()
Definition rational.cpp:59
rationalt & operator*=(const rationalt &n)
Definition rational.cpp:42
rationalt & operator-()
Definition rational.cpp:36
void invert()
Definition rational.cpp:92
mp_integer denominator
Definition rational.h:19
mp_integer numerator
Definition rational.h:18
const std::string integer2string(const mp_integer &n, unsigned base)
Definition mp_arith.cpp:103
rationalt inverse(const rationalt &n)
Definition rational.cpp:98
std::ostream & operator<<(std::ostream &out, const rationalt &a)
Definition rational.cpp:105
#define PRECONDITION(CONDITION)
Definition invariant.h:463