Changes in src/libcfa/rational.c [3d9b5da:9827c7ba]
- File:
-
- 1 edited
-
src/libcfa/rational.c (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/rational.c
r3d9b5da r9827c7ba 11 11 // Created On : Wed Apr 6 17:54:28 2016 12 12 // Last Modified By : Peter A. Buhr 13 // Last Modified On : Thu Apr 7 17:28:03201614 // Update Count : 1 213 // Last Modified On : Fri Apr 8 17:35:05 2016 14 // Update Count : 18 15 15 // 16 16 … … 23 23 } // extern 24 24 25 26 // constants 27 25 28 struct Rational 0 = {0, 1}; 26 29 struct Rational 1 = {1, 1}; 27 30 28 // Calculate the greatest common denominator of two numbers, the first of which may be negative. It is used to reduce 29 // rationals. 30 31 long int gcd( long int a, long int b ) { 31 32 // helper 33 34 // Calculate greatest common denominator of two numbers, the first of which may be negative. Used to reduce rationals. 35 static long int gcd( long int a, long int b ) { 32 36 for ( ;; ) { // Euclid's algorithm 33 37 long int r = a % b; … … 39 43 } // gcd 40 44 41 long int simplify( long int *n, long int *d ) {45 static long int simplify( long int *n, long int *d ) { 42 46 if ( *d == 0 ) { 43 47 serr | "Invalid rational number construction: denominator cannot be equal to 0." | endl; … … 48 52 } // Rationalnumber::simplify 49 53 50 Rational rational() { // constructor 51 // r = (Rational){ 0, 1 }; 52 Rational t = { 0, 1 }; 53 return t; 54 55 // constructors 56 57 Rational rational() { 58 return (Rational){ 0, 1 }; 54 59 } // rational 55 60 56 Rational rational( long int n ) { // constructor 57 // r = (Rational){ n, 1 }; 58 Rational t = { n, 1 }; 59 return t; 61 Rational rational( long int n ) { 62 return (Rational){ n, 1 }; 60 63 } // rational 61 64 62 Rational rational( long int n, long int d ) { // constructor65 Rational rational( long int n, long int d ) { 63 66 long int t = simplify( &n, &d ); // simplify 64 // r = (Rational){ n / t, d / t }; 65 Rational t = { n / t, d / t }; 66 return t; 67 return (Rational){ n / t, d / t }; 67 68 } // rational 69 70 71 // getter/setter for numerator/denominator 68 72 69 73 long int numerator( Rational r ) { … … 79 83 } // numerator 80 84 85 long int denominator( Rational r ) { 86 return r.denominator; 87 } // denominator 88 81 89 long int denominator( Rational r, long int d ) { 82 90 long int prev = r.denominator; … … 87 95 } // denominator 88 96 97 98 // comparison 99 89 100 int ?==?( Rational l, Rational r ) { 90 101 return l.numerator * r.denominator == l.denominator * r.numerator; … … 110 121 return ! ( l < r ); 111 122 } // ?>=? 123 124 125 // arithmetic 112 126 113 127 Rational -?( Rational r ) { … … 149 163 return t; 150 164 } // ?/? 165 166 167 // conversion 151 168 152 169 double widen( Rational r ) { … … 188 205 } // narrow 189 206 207 208 // I/O 209 190 210 forall( dtype istype | istream( istype ) ) 191 211 istype * ?|?( istype *is, Rational *r ) {
Note:
See TracChangeset
for help on using the changeset viewer.