// // Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo // // The contents of this file are covered under the licence agreement in the // file "LICENCE" distributed with Cforall. // // rational -- Rational numbers are numbers written as a ratio, i.e., as a fraction, where the numerator (top number) // and the denominator (bottom number) are whole numbers. When creating and computing with rational numbers, results // are constantly reduced to keep the numerator and denominator as small as possible. // // Author : Peter A. Buhr // Created On : Wed Apr 6 17:56:25 2016 // Last Modified By : Peter A. Buhr // Last Modified On : Tue Jul 20 17:45:29 2021 // Update Count : 118 // #pragma once #include "iostream.hfa" #include "math.trait.hfa" // Arithmetic // implementation forall( T | Arithmetic( T ) ) { struct Rational { T numerator, denominator; // invariant: denominator > 0 }; // Rational // constructors void ?{}( Rational(T) & r ); void ?{}( Rational(T) & r, zero_t ); void ?{}( Rational(T) & r, one_t ); void ?{}( Rational(T) & r, T n ); void ?{}( Rational(T) & r, T n, T d ); // numerator/denominator getter T numerator( Rational(T) r ); T denominator( Rational(T) r ); [ T, T ] ?=?( & [ T, T ] dest, Rational(T) src ); // numerator/denominator setter T numerator( Rational(T) r, T n ); T denominator( Rational(T) r, T d ); // comparison int ?==?( Rational(T) l, Rational(T) r ); int ?!=?( Rational(T) l, Rational(T) r ); int ?!=?( Rational(T) l, zero_t ); // => ! int ??( Rational(T) l, Rational(T) r ); int ?>=?( Rational(T) l, Rational(T) r ); // arithmetic Rational(T) +?( Rational(T) r ); Rational(T) -?( Rational(T) r ); Rational(T) ?+?( Rational(T) l, Rational(T) r ); Rational(T) ?+=?( Rational(T) & l, Rational(T) r ); Rational(T) ?+=?( Rational(T) & l, one_t ); // => ++?, ?++ Rational(T) ?-?( Rational(T) l, Rational(T) r ); Rational(T) ?-=?( Rational(T) & l, Rational(T) r ); Rational(T) ?-=?( Rational(T) & l, one_t ); // => --?, ?-- Rational(T) ?*?( Rational(T) l, Rational(T) r ); Rational(T) ?*=?( Rational(T) & l, Rational(T) r ); Rational(T) ?/?( Rational(T) l, Rational(T) r ); Rational(T) ?/=?( Rational(T) & l, Rational(T) r ); // I/O forall( istype & | istream( istype ) | { istype & ?|?( istype &, T & ); } ) istype & ?|?( istype &, Rational(T) & ); forall( ostype & | ostream( ostype ) | { ostype & ?|?( ostype &, T ); } ) { ostype & ?|?( ostype &, Rational(T) ); void ?|?( ostype &, Rational(T) ); } // distribution } // distribution forall( T | Arithmetic( T ) | { T ?\?( T, unsigned long ); } ) { Rational(T) ?\?( Rational(T) x, long int y ); Rational(T) ?\=?( Rational(T) & x, long int y ); } // distribution // conversion forall( T | Arithmetic( T ) | { double convert( T ); } ) double widen( Rational(T) r ); forall( T | Arithmetic( T ) | { double convert( T ); T convert( double );} ) Rational(T) narrow( double f, T md ); // Local Variables: // // mode: c // // tab-width: 4 // // End: //