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 : Tue Dec 4 23:07:46 2018
|
---|
15 | // Update Count : 106
|
---|
16 | //
|
---|
17 |
|
---|
18 | #pragma once
|
---|
19 |
|
---|
20 | #include "iostream.hfa"
|
---|
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 | void ?{}( Rational(RationalImpl) & r );
|
---|
56 | void ?{}( Rational(RationalImpl) & r, RationalImpl n );
|
---|
57 | void ?{}( Rational(RationalImpl) & r, RationalImpl n, RationalImpl d );
|
---|
58 | void ?{}( Rational(RationalImpl) & r, zero_t );
|
---|
59 | void ?{}( Rational(RationalImpl) & r, one_t );
|
---|
60 |
|
---|
61 | // numerator/denominator getter
|
---|
62 |
|
---|
63 | RationalImpl numerator( Rational(RationalImpl) r );
|
---|
64 | RationalImpl denominator( Rational(RationalImpl) r );
|
---|
65 | [ RationalImpl, RationalImpl ] ?=?( & [ RationalImpl, RationalImpl ] dest, Rational(RationalImpl) src );
|
---|
66 |
|
---|
67 | // numerator/denominator setter
|
---|
68 |
|
---|
69 | RationalImpl numerator( Rational(RationalImpl) r, RationalImpl n );
|
---|
70 | RationalImpl denominator( Rational(RationalImpl) r, RationalImpl d );
|
---|
71 |
|
---|
72 | // comparison
|
---|
73 |
|
---|
74 | int ?==?( Rational(RationalImpl) l, Rational(RationalImpl) r );
|
---|
75 | int ?!=?( Rational(RationalImpl) l, Rational(RationalImpl) r );
|
---|
76 | int ?<?( Rational(RationalImpl) l, Rational(RationalImpl) r );
|
---|
77 | int ?<=?( Rational(RationalImpl) l, Rational(RationalImpl) r );
|
---|
78 | int ?>?( Rational(RationalImpl) l, Rational(RationalImpl) r );
|
---|
79 | int ?>=?( Rational(RationalImpl) l, Rational(RationalImpl) r );
|
---|
80 |
|
---|
81 | // arithmetic
|
---|
82 |
|
---|
83 | Rational(RationalImpl) +?( Rational(RationalImpl) r );
|
---|
84 | Rational(RationalImpl) -?( Rational(RationalImpl) r );
|
---|
85 | Rational(RationalImpl) ?+?( Rational(RationalImpl) l, Rational(RationalImpl) r );
|
---|
86 | Rational(RationalImpl) ?-?( Rational(RationalImpl) l, Rational(RationalImpl) r );
|
---|
87 | Rational(RationalImpl) ?*?( Rational(RationalImpl) l, Rational(RationalImpl) r );
|
---|
88 | Rational(RationalImpl) ?/?( Rational(RationalImpl) l, Rational(RationalImpl) r );
|
---|
89 |
|
---|
90 | // I/O
|
---|
91 | forall( dtype istype | istream( istype ) | { istype & ?|?( istype &, RationalImpl & ); } )
|
---|
92 | istype & ?|?( istype &, Rational(RationalImpl) & );
|
---|
93 |
|
---|
94 | forall( dtype ostype | ostream( ostype ) | { ostype & ?|?( ostype &, RationalImpl ); } ) {
|
---|
95 | ostype & ?|?( ostype &, Rational(RationalImpl) );
|
---|
96 | void ?|?( ostype &, Rational(RationalImpl) );
|
---|
97 | } // distribution
|
---|
98 | } // distribution
|
---|
99 |
|
---|
100 | // conversion
|
---|
101 | forall( otype RationalImpl | arithmetic( RationalImpl ) | { double convert( RationalImpl ); } )
|
---|
102 | double widen( Rational(RationalImpl) r );
|
---|
103 | forall( otype RationalImpl | arithmetic( RationalImpl ) | { double convert( RationalImpl ); RationalImpl convert( double );} )
|
---|
104 | Rational(RationalImpl) narrow( double f, RationalImpl md );
|
---|
105 |
|
---|
106 | // Local Variables: //
|
---|
107 | // mode: c //
|
---|
108 | // tab-width: 4 //
|
---|
109 | // End: //
|
---|