1 | //
|
---|
2 | // Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
|
---|
3 | //
|
---|
4 | // The contents of this file are covered under the licence agreement in the
|
---|
5 | // file "LICENCE" distributed with Cforall.
|
---|
6 | //
|
---|
7 | // rational -- Rational numbers are numbers written as a ratio, i.e., as a fraction, where the numerator (top number)
|
---|
8 | // and the denominator (bottom number) are whole numbers. When creating and computing with rational numbers, results
|
---|
9 | // are constantly reduced to keep the numerator and denominator as small as possible.
|
---|
10 | //
|
---|
11 | // Author : Peter A. Buhr
|
---|
12 | // Created On : Wed Apr 6 17:56:25 2016
|
---|
13 | // Last Modified By : Peter A. Buhr
|
---|
14 | // Last Modified On : Wed Dec 6 23:12:53 2017
|
---|
15 | // Update Count : 97
|
---|
16 | //
|
---|
17 |
|
---|
18 | #pragma once
|
---|
19 |
|
---|
20 | #include "iostream"
|
---|
21 |
|
---|
22 | trait scalar( otype T ) {
|
---|
23 | };
|
---|
24 |
|
---|
25 | trait arithmetic( otype T | scalar( T ) ) {
|
---|
26 | int !?( T );
|
---|
27 | int ?==?( T, T );
|
---|
28 | int ?!=?( T, T );
|
---|
29 | int ?<?( T, T );
|
---|
30 | int ?<=?( T, T );
|
---|
31 | int ?>?( T, T );
|
---|
32 | int ?>=?( T, T );
|
---|
33 | void ?{}( T &, zero_t );
|
---|
34 | void ?{}( T &, one_t );
|
---|
35 | T +?( T );
|
---|
36 | T -?( T );
|
---|
37 | T ?+?( T, T );
|
---|
38 | T ?-?( T, T );
|
---|
39 | T ?*?( T, T );
|
---|
40 | T ?/?( T, T );
|
---|
41 | T ?%?( T, T );
|
---|
42 | T ?/=?( T &, T );
|
---|
43 | T abs( T );
|
---|
44 | };
|
---|
45 |
|
---|
46 | // implementation
|
---|
47 |
|
---|
48 | forall( otype RationalImpl | arithmetic( RationalImpl ) )
|
---|
49 | struct Rational {
|
---|
50 | RationalImpl numerator, denominator; // invariant: denominator > 0
|
---|
51 | }; // Rational
|
---|
52 |
|
---|
53 | // constructors
|
---|
54 |
|
---|
55 | forall( otype RationalImpl | arithmetic( RationalImpl ) )
|
---|
56 | void ?{}( Rational(RationalImpl) & r );
|
---|
57 |
|
---|
58 | forall( otype RationalImpl | arithmetic( RationalImpl ) )
|
---|
59 | void ?{}( Rational(RationalImpl) & r, RationalImpl n );
|
---|
60 |
|
---|
61 | forall( otype RationalImpl | arithmetic( RationalImpl ) )
|
---|
62 | void ?{}( Rational(RationalImpl) & r, RationalImpl n, RationalImpl d );
|
---|
63 |
|
---|
64 | forall( otype RationalImpl | arithmetic( RationalImpl ) )
|
---|
65 | void ?{}( Rational(RationalImpl) & r, zero_t );
|
---|
66 |
|
---|
67 | forall( otype RationalImpl | arithmetic( RationalImpl ) )
|
---|
68 | void ?{}( Rational(RationalImpl) & r, one_t );
|
---|
69 |
|
---|
70 | // numerator/denominator getter
|
---|
71 |
|
---|
72 | forall( otype RationalImpl | arithmetic( RationalImpl ) )
|
---|
73 | RationalImpl numerator( Rational(RationalImpl) r );
|
---|
74 |
|
---|
75 | forall( otype RationalImpl | arithmetic( RationalImpl ) )
|
---|
76 | RationalImpl denominator( Rational(RationalImpl) r );
|
---|
77 |
|
---|
78 | forall( otype RationalImpl | arithmetic( RationalImpl ) )
|
---|
79 | [ RationalImpl, RationalImpl ] ?=?( & [ RationalImpl, RationalImpl ] dest, Rational(RationalImpl) src );
|
---|
80 |
|
---|
81 | // numerator/denominator setter
|
---|
82 |
|
---|
83 | forall( otype RationalImpl | arithmetic( RationalImpl ) )
|
---|
84 | RationalImpl numerator( Rational(RationalImpl) r, RationalImpl n );
|
---|
85 |
|
---|
86 | forall( otype RationalImpl | arithmetic( RationalImpl ) )
|
---|
87 | RationalImpl denominator( Rational(RationalImpl) r, RationalImpl d );
|
---|
88 |
|
---|
89 | // comparison
|
---|
90 |
|
---|
91 | forall( otype RationalImpl | arithmetic( RationalImpl ) )
|
---|
92 | int ?==?( Rational(RationalImpl) l, Rational(RationalImpl) r );
|
---|
93 |
|
---|
94 | forall( otype RationalImpl | arithmetic( RationalImpl ) )
|
---|
95 | int ?!=?( Rational(RationalImpl) l, Rational(RationalImpl) r );
|
---|
96 |
|
---|
97 | forall( otype RationalImpl | arithmetic( RationalImpl ) )
|
---|
98 | int ?<?( Rational(RationalImpl) l, Rational(RationalImpl) r );
|
---|
99 |
|
---|
100 | forall( otype RationalImpl | arithmetic( RationalImpl ) )
|
---|
101 | int ?<=?( Rational(RationalImpl) l, Rational(RationalImpl) r );
|
---|
102 |
|
---|
103 | forall( otype RationalImpl | arithmetic( RationalImpl ) )
|
---|
104 | int ?>?( Rational(RationalImpl) l, Rational(RationalImpl) r );
|
---|
105 |
|
---|
106 | forall( otype RationalImpl | arithmetic( RationalImpl ) )
|
---|
107 | int ?>=?( Rational(RationalImpl) l, Rational(RationalImpl) r );
|
---|
108 |
|
---|
109 | // arithmetic
|
---|
110 |
|
---|
111 | forall( otype RationalImpl | arithmetic( RationalImpl ) )
|
---|
112 | Rational(RationalImpl) +?( Rational(RationalImpl) r );
|
---|
113 |
|
---|
114 | forall( otype RationalImpl | arithmetic( RationalImpl ) )
|
---|
115 | Rational(RationalImpl) -?( Rational(RationalImpl) r );
|
---|
116 |
|
---|
117 | forall( otype RationalImpl | arithmetic( RationalImpl ) )
|
---|
118 | Rational(RationalImpl) ?+?( Rational(RationalImpl) l, Rational(RationalImpl) r );
|
---|
119 |
|
---|
120 | forall( otype RationalImpl | arithmetic( RationalImpl ) )
|
---|
121 | Rational(RationalImpl) ?-?( Rational(RationalImpl) l, Rational(RationalImpl) r );
|
---|
122 |
|
---|
123 | forall( otype RationalImpl | arithmetic( RationalImpl ) )
|
---|
124 | Rational(RationalImpl) ?*?( Rational(RationalImpl) l, Rational(RationalImpl) r );
|
---|
125 |
|
---|
126 | forall( otype RationalImpl | arithmetic( RationalImpl ) )
|
---|
127 | Rational(RationalImpl) ?/?( Rational(RationalImpl) l, Rational(RationalImpl) r );
|
---|
128 |
|
---|
129 | // conversion
|
---|
130 | forall( otype RationalImpl | arithmetic( RationalImpl ) | { double convert( RationalImpl ); } )
|
---|
131 | double widen( Rational(RationalImpl) r );
|
---|
132 | forall( otype RationalImpl | arithmetic( RationalImpl ) | { double convert( RationalImpl ); RationalImpl convert( double );} )
|
---|
133 | Rational(RationalImpl) narrow( double f, RationalImpl md );
|
---|
134 |
|
---|
135 | // I/O
|
---|
136 | forall( otype RationalImpl | arithmetic( RationalImpl ) )
|
---|
137 | forall( dtype istype | istream( istype ) | { istype & ?|?( istype &, RationalImpl & ); } )
|
---|
138 | istype & ?|?( istype &, Rational(RationalImpl) & );
|
---|
139 |
|
---|
140 | forall( otype RationalImpl | arithmetic( RationalImpl ) )
|
---|
141 | forall( dtype ostype | ostream( ostype ) | { ostype & ?|?( ostype &, RationalImpl ); } )
|
---|
142 | ostype & ?|?( ostype &, Rational(RationalImpl ) );
|
---|
143 |
|
---|
144 | // Local Variables: //
|
---|
145 | // mode: c //
|
---|
146 | // tab-width: 4 //
|
---|
147 | // End: //
|
---|