gehe zur Dokumentation dieser Datei00001
00028
00029
00030
00031
00032 #include "Frac.h"
00033
00034 #ifndef HAVE_BOOST_RATIONAL_HPP
00035
00036
00037 long absLong(const long x)
00038 {
00039 if ( x >= 0 ) return x;
00040 else return -x;
00041 }
00042
00043 frac& frac::operator =(const frac& f)
00044
00045 {
00046 n = f.n;
00047 d = f.d;
00048 return *this;
00049 }
00050
00051 frac& frac::operator +=(const frac& f)
00052
00053 {
00054 if ( !d || !f.d ) {
00055 n = 1;
00056 d = 0;
00057 } else {
00058 long cd = d * (f.d / gcd(d, f.d));
00059 long cn = n * (cd/d)+ f.n * (cd/f.d);
00060 long gd = gcd(cd, cn);
00061
00062 if ( gd != 1 ) {
00063 cn /= gd;
00064 cd /= gd;
00065 }
00066
00067 n = cn;
00068
00069 d = cd;
00070 }
00071
00072 return *this;
00073 }
00074
00075 frac& frac::operator -=(const frac& f)
00076
00077 {
00078 if ( !d || !f.d ) {
00079 n = 1;
00080 d = 0;
00081 } else {
00082 long cd = d * (f.d / gcd(d, f.d));
00083 long cn = n * (cd/d) - f.n * (cd/f.d);
00084 long gd = gcd(cd, cn);
00085
00086 if ( gd != 1 ) {
00087 cn /= gd;
00088 cd /= gd;
00089 }
00090
00091 n = cn;
00092
00093 d = cd;
00094 }
00095
00096 return *this;
00097 }
00098
00099 frac& frac::operator *=(const frac& f)
00100
00101 {
00102 n *= f.n;
00103 d *= f.d;
00104 long gd = gcd(n, d);
00105
00106 if ( gd != 1 ) {
00107 n /= gd;
00108 d /= gd;
00109 }
00110
00111 return *this;
00112 }
00113
00114 frac& frac::operator /=(const frac& f)
00115
00116 {
00117 n *= f.d;
00118 d *= f.n;
00119 long gd = gcd(n, d);
00120
00121 if ( gd != 1 ) {
00122 n /= gd;
00123 d /= gd;
00124 }
00125
00126 return *this;
00127 }
00128
00129 frac frac::operator +(const frac s)
00130
00131 {
00132 if ( !d || !s.d ) return frac(1,0);
00133
00134 long cd = d * (s.d / gcd(d, s.d));
00135
00136 long cn = n * (cd/d)+ s.n * (cd/s.d);
00137
00138
00139
00140 long gd = gcd(cd, cn);
00141
00142 if ( gd != 1 ) {
00143 cn /= gd;
00144 cd /= gd;
00145 }
00146
00147 return frac(cn, cd);
00148 }
00149
00150 frac frac::operator -(const frac s)
00151
00152 {
00153 if ( !d || !s.d ) return frac(1,0);
00154
00155 long cd = d * (s.d / gcd(d, s.d));
00156
00157 long cn = n * (cd/d)- s.n * (cd/s.d);
00158
00159 long gd = gcd(cd, cn);
00160
00161 if ( gd != 1 ) {
00162 cn /= gd;
00163 cd /= gd;
00164 }
00165
00166 return frac(cn, cd);
00167 }
00168
00169 frac frac::operator *(const frac s)
00170
00171 {
00172 long cn = n * s.n;
00173 long cd = d * s.d;
00174 long gd = gcd(cd, cn);
00175
00176 if ( gd != 1 ) {
00177 cn /= gd;
00178 cd /= gd;
00179 }
00180
00181 return frac(cn, cd);
00182 }
00183
00184 frac frac::operator /(const frac s)
00185
00186 {
00187 long cn = n * s.d;
00188 long cd = d * s.n;
00189 long gd = gcd(cd, cn);
00190
00191 if ( gd != 1 ) {
00192 cn /= gd;
00193 cd /= gd;
00194 }
00195
00196 return frac(cn, cd);
00197 }
00198
00199 int frac::operator <(const frac &f)
00200
00201 {
00202 char s = 0;
00203
00204 if ( d < 0 ) s++;
00205
00206 if ( f.d < 0 ) s++;
00207
00208 if ( s == 1 )
00209 return n * f.d > d * f.n;
00210 else
00211 return n * f.d < d * f.n;
00212 }
00213
00214 int frac::operator <=(const frac &f)
00215
00216 {
00217 char s = 0;
00218
00219 if ( d < 0 ) s++;
00220
00221 if ( f.d < 0 ) s++;
00222
00223 if ( s == 1 )
00224 return n * f.d >= d * f.n;
00225 else
00226 return n * f.d <= d * f.n;
00227 }
00228
00229 int frac::operator ==(const frac &f)
00230
00231 {
00232 return d * f.n == n * f.d;
00233 }
00234
00235
00236 int frac::operator !=(const frac &f)
00237
00238 {
00239 return d * f.n != n * f.d;
00240 }
00241
00242 int frac::operator >=(const frac &f)
00243
00244 {
00245 char s = 0;
00246
00247 if ( d < 0 ) s++;
00248
00249 if ( f.d < 0 ) s++;
00250
00251 if ( s == 1 )
00252 return n * f.d <= d * f.n;
00253 else
00254 return n * f.d >= d * f.n;
00255 }
00256
00257 int frac::operator >(const frac &f)
00258
00259 {
00260 char s = 0;
00261
00262 if ( d < 0 ) s++;
00263
00264 if ( f.d < 0 ) s++;
00265
00266 if ( s == 1 )
00267 return n * f.d < d * f.n;
00268 else
00269 return n * f.d > d * f.n;
00270 }
00271
00272 frac& frac::operator =(const int &i)
00273
00274 {
00275 n = i;
00276 d = 1;
00277 return *this;
00278 }
00279
00280
00281
00282 long frac::gcd(long a, long b)
00283
00284 {
00285 long p, q, r = 1;
00286 a = absLong(a);
00287 b = absLong(b);
00288
00289 if ( a > b ) {
00290 p = a;
00291 q = b;
00292 } else {
00293 p = b;
00294 q = a;
00295 }
00296
00297 if ( !q ) return 1;
00298
00299 while ( r ) {
00300 r = p % q;
00301 p = q;
00302 q = r;
00303 }
00304
00305 return p;
00306 }
00307
00308
00309 #endif
00310
00311