Changes in libcfa/src/rational.cfa [8a25be9:ef346f7c]
- File:
-
- 1 edited
-
libcfa/src/rational.cfa (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/rational.cfa
r8a25be9 ref346f7c 10 10 // Created On : Wed Apr 6 17:54:28 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Mar 28 17:33:03 201913 // Update Count : 1 8112 // Last Modified On : Sun Dec 23 22:56:49 2018 13 // Update Count : 170 14 14 // 15 15 … … 35 35 static RationalImpl simplify( RationalImpl & n, RationalImpl & d ) { 36 36 if ( d == (RationalImpl){0} ) { 37 abort( "Invalid rational number construction: denominator cannot be equal to 0.\n" ); 37 serr | "Invalid rational number construction: denominator cannot be equal to 0."; 38 exit( EXIT_FAILURE ); 38 39 } // exit 39 40 if ( d < (RationalImpl){0} ) { d = -d; n = -n; } // move sign to numerator … … 53 54 void ?{}( Rational(RationalImpl) & r, RationalImpl n, RationalImpl d ) { 54 55 RationalImpl t = simplify( n, d ); // simplify 55 r.[numerator, denominator] = [n / t, d / t]; 56 r.numerator = n / t; 57 r.denominator = d / t; 56 58 } // rational 57 59 … … 76 78 RationalImpl prev = r.numerator; 77 79 RationalImpl t = gcd( abs( n ), r.denominator ); // simplify 78 r.[numerator, denominator] = [n / t, r.denominator / t]; 80 r.numerator = n / t; 81 r.denominator = r.denominator / t; 79 82 return prev; 80 83 } // numerator … … 83 86 RationalImpl prev = r.denominator; 84 87 RationalImpl t = simplify( r.numerator, d ); // simplify 85 r.[numerator, denominator] = [r.numerator / t, d / t]; 88 r.numerator = r.numerator / t; 89 r.denominator = d / t; 86 90 return prev; 87 91 } // denominator … … 116 120 117 121 Rational(RationalImpl) +?( Rational(RationalImpl) r ) { 118 return (Rational(RationalImpl)){ r.numerator, r.denominator }; 122 Rational(RationalImpl) t = { r.numerator, r.denominator }; 123 return t; 119 124 } // +? 120 125 121 126 Rational(RationalImpl) -?( Rational(RationalImpl) r ) { 122 return (Rational(RationalImpl)){ -r.numerator, r.denominator }; 127 Rational(RationalImpl) t = { -r.numerator, r.denominator }; 128 return t; 123 129 } // -? 124 130 125 131 Rational(RationalImpl) ?+?( Rational(RationalImpl) l, Rational(RationalImpl) r ) { 126 132 if ( l.denominator == r.denominator ) { // special case 127 return (Rational(RationalImpl)){ l.numerator + r.numerator, l.denominator }; 133 Rational(RationalImpl) t = { l.numerator + r.numerator, l.denominator }; 134 return t; 128 135 } else { 129 return (Rational(RationalImpl)){ l.numerator * r.denominator + l.denominator * r.numerator, l.denominator * r.denominator }; 136 Rational(RationalImpl) t = { l.numerator * r.denominator + l.denominator * r.numerator, l.denominator * r.denominator }; 137 return t; 130 138 } // if 131 139 } // ?+? … … 133 141 Rational(RationalImpl) ?-?( Rational(RationalImpl) l, Rational(RationalImpl) r ) { 134 142 if ( l.denominator == r.denominator ) { // special case 135 return (Rational(RationalImpl)){ l.numerator - r.numerator, l.denominator }; 143 Rational(RationalImpl) t = { l.numerator - r.numerator, l.denominator }; 144 return t; 136 145 } else { 137 return (Rational(RationalImpl)){ l.numerator * r.denominator - l.denominator * r.numerator, l.denominator * r.denominator }; 146 Rational(RationalImpl) t = { l.numerator * r.denominator - l.denominator * r.numerator, l.denominator * r.denominator }; 147 return t; 138 148 } // if 139 149 } // ?-? 140 150 141 151 Rational(RationalImpl) ?*?( Rational(RationalImpl) l, Rational(RationalImpl) r ) { 142 return (Rational(RationalImpl)){ l.numerator * r.numerator, l.denominator * r.denominator }; 152 Rational(RationalImpl) t = { l.numerator * r.numerator, l.denominator * r.denominator }; 153 return t; 143 154 } // ?*? 144 155 145 156 Rational(RationalImpl) ?/?( Rational(RationalImpl) l, Rational(RationalImpl) r ) { 146 157 if ( r.numerator < (RationalImpl){0} ) { 147 r.[numerator, denominator] = [-r.numerator, -r.denominator]; 158 r.numerator = -r.numerator; 159 r.denominator = -r.denominator; 148 160 } // if 149 return (Rational(RationalImpl)){ l.numerator * r.denominator, l.denominator * r.numerator }; 161 Rational(RationalImpl) t = { l.numerator * r.denominator, l.denominator * r.numerator }; 162 return t; 150 163 } // ?/? 151 164 … … 154 167 forall( dtype istype | istream( istype ) | { istype & ?|?( istype &, RationalImpl & ); } ) 155 168 istype & ?|?( istype & is, Rational(RationalImpl) & r ) { 169 RationalImpl t; 156 170 is | r.numerator | r.denominator; 157 RationalImplt = simplify( r.numerator, r.denominator );171 t = simplify( r.numerator, r.denominator ); 158 172 r.numerator /= t; 159 173 r.denominator /= t; … … 171 185 } // distribution 172 186 } // distribution 173 174 forall( otype RationalImpl | arithmetic( RationalImpl ) | { RationalImpl ?\?( RationalImpl, unsigned long ); } )175 Rational(RationalImpl) ?\?( Rational(RationalImpl) x, long int y ) {176 if ( y < 0 ) {177 return (Rational(RationalImpl)){ x.denominator \ -y, x.numerator \ -y };178 } else {179 return (Rational(RationalImpl)){ x.numerator \ y, x.denominator \ y };180 } // if181 }182 187 183 188 // conversion
Note:
See TracChangeset
for help on using the changeset viewer.