Changeset 933f32f for libcfa/src/rational.cfa
- Timestamp:
- May 24, 2019, 10:19:41 AM (7 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, cleanup-dtors, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- d908563
- Parents:
- 6a9d4b4 (diff), 292642a (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - File:
-
- 1 edited
-
libcfa/src/rational.cfa (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/rational.cfa
r6a9d4b4 r933f32f 10 10 // Created On : Wed Apr 6 17:54:28 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Dec 23 22:56:49 201813 // Update Count : 1 7012 // Last Modified On : Thu Mar 28 17:33:03 2019 13 // Update Count : 181 14 14 // 15 15 … … 35 35 static RationalImpl simplify( RationalImpl & n, RationalImpl & d ) { 36 36 if ( d == (RationalImpl){0} ) { 37 serr | "Invalid rational number construction: denominator cannot be equal to 0."; 38 exit( EXIT_FAILURE ); 37 abort( "Invalid rational number construction: denominator cannot be equal to 0.\n" ); 39 38 } // exit 40 39 if ( d < (RationalImpl){0} ) { d = -d; n = -n; } // move sign to numerator … … 54 53 void ?{}( Rational(RationalImpl) & r, RationalImpl n, RationalImpl d ) { 55 54 RationalImpl t = simplify( n, d ); // simplify 56 r.numerator = n / t; 57 r.denominator = d / t; 55 r.[numerator, denominator] = [n / t, d / t]; 58 56 } // rational 59 57 … … 78 76 RationalImpl prev = r.numerator; 79 77 RationalImpl t = gcd( abs( n ), r.denominator ); // simplify 80 r.numerator = n / t; 81 r.denominator = r.denominator / t; 78 r.[numerator, denominator] = [n / t, r.denominator / t]; 82 79 return prev; 83 80 } // numerator … … 86 83 RationalImpl prev = r.denominator; 87 84 RationalImpl t = simplify( r.numerator, d ); // simplify 88 r.numerator = r.numerator / t; 89 r.denominator = d / t; 85 r.[numerator, denominator] = [r.numerator / t, d / t]; 90 86 return prev; 91 87 } // denominator … … 120 116 121 117 Rational(RationalImpl) +?( Rational(RationalImpl) r ) { 122 Rational(RationalImpl) t = { r.numerator, r.denominator }; 123 return t; 118 return (Rational(RationalImpl)){ r.numerator, r.denominator }; 124 119 } // +? 125 120 126 121 Rational(RationalImpl) -?( Rational(RationalImpl) r ) { 127 Rational(RationalImpl) t = { -r.numerator, r.denominator }; 128 return t; 122 return (Rational(RationalImpl)){ -r.numerator, r.denominator }; 129 123 } // -? 130 124 131 125 Rational(RationalImpl) ?+?( Rational(RationalImpl) l, Rational(RationalImpl) r ) { 132 126 if ( l.denominator == r.denominator ) { // special case 133 Rational(RationalImpl) t = { l.numerator + r.numerator, l.denominator }; 134 return t; 127 return (Rational(RationalImpl)){ l.numerator + r.numerator, l.denominator }; 135 128 } else { 136 Rational(RationalImpl) t = { l.numerator * r.denominator + l.denominator * r.numerator, l.denominator * r.denominator }; 137 return t; 129 return (Rational(RationalImpl)){ l.numerator * r.denominator + l.denominator * r.numerator, l.denominator * r.denominator }; 138 130 } // if 139 131 } // ?+? … … 141 133 Rational(RationalImpl) ?-?( Rational(RationalImpl) l, Rational(RationalImpl) r ) { 142 134 if ( l.denominator == r.denominator ) { // special case 143 Rational(RationalImpl) t = { l.numerator - r.numerator, l.denominator }; 144 return t; 135 return (Rational(RationalImpl)){ l.numerator - r.numerator, l.denominator }; 145 136 } else { 146 Rational(RationalImpl) t = { l.numerator * r.denominator - l.denominator * r.numerator, l.denominator * r.denominator }; 147 return t; 137 return (Rational(RationalImpl)){ l.numerator * r.denominator - l.denominator * r.numerator, l.denominator * r.denominator }; 148 138 } // if 149 139 } // ?-? 150 140 151 141 Rational(RationalImpl) ?*?( Rational(RationalImpl) l, Rational(RationalImpl) r ) { 152 Rational(RationalImpl) t = { l.numerator * r.numerator, l.denominator * r.denominator }; 153 return t; 142 return (Rational(RationalImpl)){ l.numerator * r.numerator, l.denominator * r.denominator }; 154 143 } // ?*? 155 144 156 145 Rational(RationalImpl) ?/?( Rational(RationalImpl) l, Rational(RationalImpl) r ) { 157 146 if ( r.numerator < (RationalImpl){0} ) { 158 r.numerator = -r.numerator; 159 r.denominator = -r.denominator; 147 r.[numerator, denominator] = [-r.numerator, -r.denominator]; 160 148 } // if 161 Rational(RationalImpl) t = { l.numerator * r.denominator, l.denominator * r.numerator }; 162 return t; 149 return (Rational(RationalImpl)){ l.numerator * r.denominator, l.denominator * r.numerator }; 163 150 } // ?/? 164 151 … … 167 154 forall( dtype istype | istream( istype ) | { istype & ?|?( istype &, RationalImpl & ); } ) 168 155 istype & ?|?( istype & is, Rational(RationalImpl) & r ) { 169 RationalImpl t;170 156 is | r.numerator | r.denominator; 171 t = simplify( r.numerator, r.denominator );157 RationalImpl t = simplify( r.numerator, r.denominator ); 172 158 r.numerator /= t; 173 159 r.denominator /= t; … … 185 171 } // distribution 186 172 } // 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 } // if 181 } 187 182 188 183 // conversion
Note:
See TracChangeset
for help on using the changeset viewer.