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