Frac.cpp
gehe zur Dokumentation dieser Datei
00001 
00028 // ##################################################################
00029 // frac ... calculating with fractions
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 //  long cd = gcd(d, s.d);
00139 //  long cn = n * (s.d/cd)+ s.n * (d/cd);
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 

Erzeugt am Sun Aug 21 2011 10:51:51 für Mutabor von doxygen 1.7.4