source: src/libcfa/rational@ 4c3ee8d

ADT aaron-thesis arm-eh ast-experimental cleanup-dtors deferred_resn demangler enum forall-pointer-decay jacob/cs343-translation jenkins-sandbox new-ast new-ast-unique-expr no_list persistent-indexer pthread-emulation qualifiedEnum
Last change on this file since 4c3ee8d was 3ce0d440, checked in by Peter A. Buhr <pabuhr@…>, 7 years ago

more push/pop updates

  • Property mode set to 100644
File size: 3.6 KB
Line 
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 : Sat Jun 2 09:10:01 2018
15// Update Count : 105
16//
17
18#pragma once
19
20#include "iostream"
21
22trait scalar( otype T ) {
23};
24
25trait 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
48forall( 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} // distribution
97
98// conversion
99forall( otype RationalImpl | arithmetic( RationalImpl ) | { double convert( RationalImpl ); } )
100double widen( Rational(RationalImpl) r );
101forall( otype RationalImpl | arithmetic( RationalImpl ) | { double convert( RationalImpl ); RationalImpl convert( double );} )
102Rational(RationalImpl) narrow( double f, RationalImpl md );
103
104// Local Variables: //
105// mode: c //
106// tab-width: 4 //
107// End: //
Note: See TracBrowser for help on using the repository browser.