source: libcfa/src/rational.hfa@ b28ce93

Last change on this file since b28ce93 was eae8b37, checked in by JiadaL <j82liang@…>, 10 months ago

Move enum.hfa/enum.cfa to prelude

  • Property mode set to 100644
File size: 3.2 KB
RevLine 
[bb82c03]1//
[53ba273]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.
[bb82c03]6//
[630a82a]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.
[bb82c03]10//
[53ba273]11// Author : Peter A. Buhr
12// Created On : Wed Apr 6 17:56:25 2016
13// Last Modified By : Peter A. Buhr
[f5e37a4]14// Last Modified On : Wed Nov 27 18:11:07 2024
15// Update Count : 128
[bb82c03]16//
[f621a148]17
[53a6c2a]18#pragma once
[53ba273]19
[58b6d1b]20#include "iostream.hfa"
[541dbc09]21#include "math.trait.hfa" // arithmetic
[561f730]22
[f5e37a4]23// Implementation
[561f730]24
[44e2a5a]25forall( T ) {
[541dbc09]26 struct rational {
[5dc4c7e]27 T numerator, denominator; // invariant: denominator > 0
[541dbc09]28 }; // rational
[44e2a5a]29}
[53ba273]30
[f5e37a4]31// Arithmetic, Relational
32
[44e2a5a]33forall( T | arithmetic( T ) ) {
[3ce0d440]34 // constructors
[561f730]35
[541dbc09]36 void ?{}( rational(T) & r );
37 void ?{}( rational(T) & r, zero_t );
38 void ?{}( rational(T) & r, one_t );
39 void ?{}( rational(T) & r, T n );
40 void ?{}( rational(T) & r, T n, T d );
[561f730]41
[3ce0d440]42 // numerator/denominator getter
[561f730]43
[541dbc09]44 T numerator( rational(T) r );
45 T denominator( rational(T) r );
[92211d9]46 [ T, T ] ?=?( & [ T, T ] dst, rational(T) src );
[561f730]47
[3ce0d440]48 // numerator/denominator setter
[561f730]49
[541dbc09]50 T numerator( rational(T) r, T n );
51 T denominator( rational(T) r, T d );
[630a82a]52
[3ce0d440]53 // comparison
[561f730]54
[541dbc09]55 int ?==?( rational(T) l, rational(T) r );
56 int ?!=?( rational(T) l, rational(T) r );
57 int ?!=?( rational(T) l, zero_t ); // => !
58 int ?<?( rational(T) l, rational(T) r );
59 int ?<=?( rational(T) l, rational(T) r );
60 int ?>?( rational(T) l, rational(T) r );
61 int ?>=?( rational(T) l, rational(T) r );
[561f730]62
[3ce0d440]63 // arithmetic
[53a6c2a]64
[541dbc09]65 rational(T) +?( rational(T) r );
66 rational(T) -?( rational(T) r );
67 rational(T) ?+?( rational(T) l, rational(T) r );
68 rational(T) ?+=?( rational(T) & l, rational(T) r );
69 rational(T) ?+=?( rational(T) & l, one_t ); // => ++?, ?++
70 rational(T) ?-?( rational(T) l, rational(T) r );
71 rational(T) ?-=?( rational(T) & l, rational(T) r );
72 rational(T) ?-=?( rational(T) & l, one_t ); // => --?, ?--
73 rational(T) ?*?( rational(T) l, rational(T) r );
74 rational(T) ?*=?( rational(T) & l, rational(T) r );
75 rational(T) ?/?( rational(T) l, rational(T) r );
76 rational(T) ?/=?( rational(T) & l, rational(T) r );
[71f3d45]77} // distribution
[561f730]78
[f5e37a4]79// I/O
[eae8b37]80forall(T | multiplicative(T) | equality(T))
81trait Simple {
82 int ?<?( T, T );
83};
[f5e37a4]84
[71f3d45]85forall( T ) {
[eae8b37]86 forall( istype & | istream( istype ) | { istype & ?|?( istype &, T & ); } | Simple(T) )
[f5e37a4]87 istype & ?|?( istype &, rational(T) & );
88
[5dc4c7e]89 forall( ostype & | ostream( ostype ) | { ostype & ?|?( ostype &, T ); } ) {
[541dbc09]90 ostype & ?|?( ostype &, rational(T) );
[5454d77]91 OSTYPE_VOID( rational(T) );
[200fcb3]92 } // distribution
[3ce0d440]93} // distribution
[630a82a]94
[f5e37a4]95// Exponentiation
96
[541dbc09]97forall( T | arithmetic( T ) | { T ?\?( T, unsigned long ); } ) {
98 rational(T) ?\?( rational(T) x, long int y );
99 rational(T) ?\=?( rational(T) & x, long int y );
[5dc4c7e]100} // distribution
[0087e0e]101
[f5e37a4]102// Conversion
103
[541dbc09]104forall( T | arithmetic( T ) | { double convert( T ); } )
105double widen( rational(T) r );
106forall( T | arithmetic( T ) | { double convert( T ); T convert( double );} )
107rational(T) narrow( double f, T md );
[630a82a]108
[53ba273]109// Local Variables: //
110// mode: c //
111// tab-width: 4 //
112// End: //
Note: See TracBrowser for help on using the repository browser.