00001
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #ifndef _FRACTION_H_
00035 #define _FRACTION_H_
00036
00037
00038
00039
00040 #include <string>
00041 #include <iosfwd>
00042 #include <utility>
00043 #include <cmath>
00044
00045
00046 #include "osberror.h"
00047
00048
00049
00050 namespace OSB_LIB {
00051
00061 class Fraction {
00062 public:
00064 Fraction()
00065 : nominator_(0), denominator_(1)
00066 {
00067
00068 }
00069
00071 Fraction(long nominator, long denominator = 1);
00072
00074 long nominator() const { return nominator_; }
00076 long denominator() const { return denominator_; }
00078 double dbl() const
00079 {
00080 double rc = nominator_;
00081 rc /= denominator_;
00082 return rc;
00083 }
00084
00086 std::string str() const;
00087
00089 inline Fraction& operator-();
00091 Fraction& operator+=(const Fraction&);
00093 Fraction& operator-=(const Fraction&);
00095 Fraction& operator*=(const Fraction&);
00097 Fraction& operator/=(const Fraction&);
00098
00099 private:
00101 void reduce();
00102
00104 void divide(long& higher, long& lower);
00105 private:
00107 long nominator_;
00109 long denominator_;
00110 };
00111
00113 inline Fraction operator*(const Fraction&, const Fraction&);
00115 inline Fraction operator/(const Fraction&, const Fraction&);
00117 inline Fraction operator+(const Fraction&, const Fraction&);
00119 inline Fraction operator-(const Fraction&, const Fraction&);
00121 inline bool operator==(const Fraction& lhs, const Fraction& rhs);
00123 inline bool operator!=(const Fraction& lhs, const Fraction& rhs);
00124
00130 std::ostream& operator<<(std::ostream& os, const Fraction& f);
00131 }
00132
00133
00134
00135 namespace OSB_LIB {
00136 inline Fraction& Fraction::operator-()
00137 {
00138 nominator_ *= -1;
00139 return *this;
00140 }
00141
00142 inline Fraction operator+(const Fraction& f1, const Fraction& f2)
00143 {
00144 Fraction r(f1);
00145 return r += f2;
00146 }
00147
00148 inline Fraction operator-(const Fraction& f1, const Fraction& f2)
00149 {
00150 Fraction r(f1);
00151 return r -= f2;
00152 }
00153
00154 inline Fraction operator*(const Fraction& f1, const Fraction& f2)
00155 {
00156 Fraction r(f1);
00157 return r *= f2;
00158 }
00159
00160 inline Fraction operator/(const Fraction& f1, const Fraction& f2)
00161 {
00162 Fraction r(f1);
00163 return r /= f2;
00164 }
00165
00166 inline bool operator==(const Fraction& lhs, const Fraction& rhs)
00167 {
00168 return (lhs.nominator() == rhs.nominator() &&
00169 lhs.denominator() == rhs.denominator());
00170 }
00171
00172 inline bool operator!=(const Fraction& lhs, const Fraction& rhs)
00173 {
00174 return lhs != rhs;
00175 }
00176 }
00177 #endif // #ifndef _FRACTION_H_