source: libcfa/src/rational.hfa @ 09ee131

ADTarm-ehast-experimentalenumforall-pointer-decayjacob/cs343-translationnew-ast-unique-exprpthread-emulationqualifiedEnum
Last change on this file since 09ee131 was 0087e0e, checked in by Peter A. Buhr <pabuhr@…>, 6 years ago

add rational exponentiation, code clean up

  • Property mode set to 100644
File size: 3.8 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 : Tue Mar 26 23:16:10 2019
15// Update Count     : 109
16//
17
18#pragma once
19
20#include "iostream.hfa"
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                void ?|?( ostype &, Rational(RationalImpl) );
97        } // distribution
98} // distribution
99
100forall( otype RationalImpl | arithmetic( RationalImpl ) |{RationalImpl ?\?( RationalImpl, unsigned long );} )
101Rational(RationalImpl) ?\?( Rational(RationalImpl) x, long int y );
102
103// conversion
104forall( otype RationalImpl | arithmetic( RationalImpl ) | { double convert( RationalImpl ); } )
105double widen( Rational(RationalImpl) r );
106forall( otype RationalImpl | arithmetic( RationalImpl ) | { double convert( RationalImpl );  RationalImpl convert( double );} )
107Rational(RationalImpl) narrow( double f, RationalImpl md );
108
109// Local Variables: //
110// mode: c //
111// tab-width: 4 //
112// End: //
Note: See TracBrowser for help on using the repository browser.