source: libcfa/src/rational.hfa@ a5294af

ast-experimental
Last change on this file since a5294af was 5dc4c7e, checked in by Peter A. Buhr <pabuhr@…>, 4 years ago

formatting, use new math trait in rational numbers

  • Property mode set to 100644
File size: 3.1 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 Jul 20 17:45:29 2021
15// Update Count : 118
16//
17
18#pragma once
19
20#include "iostream.hfa"
21#include "math.trait.hfa" // Arithmetic
22
23// implementation
24
25forall( T | Arithmetic( T ) ) {
26 struct Rational {
27 T numerator, denominator; // invariant: denominator > 0
28 }; // Rational
29
30 // constructors
31
32 void ?{}( Rational(T) & r );
33 void ?{}( Rational(T) & r, zero_t );
34 void ?{}( Rational(T) & r, one_t );
35 void ?{}( Rational(T) & r, T n );
36 void ?{}( Rational(T) & r, T n, T d );
37
38 // numerator/denominator getter
39
40 T numerator( Rational(T) r );
41 T denominator( Rational(T) r );
42 [ T, T ] ?=?( & [ T, T ] dest, Rational(T) src );
43
44 // numerator/denominator setter
45
46 T numerator( Rational(T) r, T n );
47 T denominator( Rational(T) r, T d );
48
49 // comparison
50
51 int ?==?( Rational(T) l, Rational(T) r );
52 int ?!=?( Rational(T) l, Rational(T) r );
53 int ?!=?( Rational(T) l, zero_t ); // => !
54 int ?<?( Rational(T) l, Rational(T) r );
55 int ?<=?( Rational(T) l, Rational(T) r );
56 int ?>?( Rational(T) l, Rational(T) r );
57 int ?>=?( Rational(T) l, Rational(T) r );
58
59 // arithmetic
60
61 Rational(T) +?( Rational(T) r );
62 Rational(T) -?( Rational(T) r );
63 Rational(T) ?+?( Rational(T) l, Rational(T) r );
64 Rational(T) ?+=?( Rational(T) & l, Rational(T) r );
65 Rational(T) ?+=?( Rational(T) & l, one_t ); // => ++?, ?++
66 Rational(T) ?-?( Rational(T) l, Rational(T) r );
67 Rational(T) ?-=?( Rational(T) & l, Rational(T) r );
68 Rational(T) ?-=?( Rational(T) & l, one_t ); // => --?, ?--
69 Rational(T) ?*?( Rational(T) l, Rational(T) r );
70 Rational(T) ?*=?( Rational(T) & l, Rational(T) r );
71 Rational(T) ?/?( Rational(T) l, Rational(T) r );
72 Rational(T) ?/=?( Rational(T) & l, Rational(T) r );
73
74 // I/O
75 forall( istype & | istream( istype ) | { istype & ?|?( istype &, T & ); } )
76 istype & ?|?( istype &, Rational(T) & );
77
78 forall( ostype & | ostream( ostype ) | { ostype & ?|?( ostype &, T ); } ) {
79 ostype & ?|?( ostype &, Rational(T) );
80 void ?|?( ostype &, Rational(T) );
81 } // distribution
82} // distribution
83
84forall( T | Arithmetic( T ) | { T ?\?( T, unsigned long ); } ) {
85 Rational(T) ?\?( Rational(T) x, long int y );
86 Rational(T) ?\=?( Rational(T) & x, long int y );
87} // distribution
88
89// conversion
90forall( T | Arithmetic( T ) | { double convert( T ); } )
91double widen( Rational(T) r );
92forall( T | Arithmetic( T ) | { double convert( T ); T convert( double );} )
93Rational(T) narrow( double f, T md );
94
95// Local Variables: //
96// mode: c //
97// tab-width: 4 //
98// End: //
Note: See TracBrowser for help on using the repository browser.