diff options
author | Ben Boeckel <MathStuf@gmail.com> | 2008-12-16 20:08:40 -0500 |
---|---|---|
committer | Ben Boeckel <MathStuf@gmail.com> | 2008-12-16 20:08:40 -0500 |
commit | 36110d3c54b7bfb0878816a0b96c9075e2b1814f (patch) | |
tree | f6a6fab540bd6309b779582d64d15ee69da1c4fb /sigcore | |
parent | 9e0e72b5256a936fa99d5b1dc4790f97b575a54e (diff) | |
download | sigen-36110d3c54b7bfb0878816a0b96c9075e2b1814f.tar.gz sigen-36110d3c54b7bfb0878816a0b96c9075e2b1814f.tar.xz sigen-36110d3c54b7bfb0878816a0b96c9075e2b1814f.zip |
Added modulo operation to Fraction
Diffstat (limited to 'sigcore')
-rw-r--r-- | sigcore/Fraction.cpp | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/sigcore/Fraction.cpp b/sigcore/Fraction.cpp index f5e5e3a3..9c4fa1a9 100644 --- a/sigcore/Fraction.cpp +++ b/sigcore/Fraction.cpp @@ -99,22 +99,42 @@ Sigcore::Fraction::operator double() const Sigcore::Fraction Sigcore::Fraction::operator+(const Fraction& rhs) const { - return Fraction((m_numerator * rhs.m_denominator) + (m_denominator * rhs.m_numerator), m_denominator * rhs.m_denominator); + Fraction ans((m_numerator * rhs.m_denominator) + (m_denominator * rhs.m_numerator), m_denominator * rhs.m_denominator); + ans.reduce(); + return ans; } Sigcore::Fraction Sigcore::Fraction::operator-(const Fraction& rhs) const { - return Fraction((m_numerator * rhs.m_denominator) - (m_denominator * rhs.m_numerator), m_denominator * rhs.m_denominator); + Fraction ans((m_numerator * rhs.m_denominator) - (m_denominator * rhs.m_numerator), m_denominator * rhs.m_denominator); + ans.reduce(); + return ans; } Sigcore::Fraction Sigcore::Fraction::operator*(const Fraction& rhs) const { - return Fraction(m_numerator * rhs.m_numerator, m_denominator * rhs.m_denominator); + Fraction ans(m_numerator * rhs.m_numerator, m_denominator * rhs.m_denominator); + ans.reduce(); + return ans; } Sigcore::Fraction Sigcore::Fraction::operator/(const Fraction& rhs) const { - return Fraction(m_numerator * rhs.m_denominator, m_denominator * rhs.m_numerator); + Fraction ans(m_numerator * rhs.m_denominator, m_denominator * rhs.m_numerator); + ans.reduce(); + return ans; +} + +Sigcore::Fraction Sigcore::Fraction::operator%(const Fraction& rhs) const +{ + // FIXME: can it be done directly? + Fraction ans(rhs); + while (*this < ans) + ans -= *this; + while (ans <= 0) + ans += *this; + ans.reduce(); + return ans; } Sigcore::Fraction& Sigcore::Fraction::operator+=(const Fraction& rhs) @@ -137,6 +157,11 @@ Sigcore::Fraction& Sigcore::Fraction::operator/=(const Fraction& rhs) return *this = *this / rhs; } +Sigcore::Fraction& Sigcore::Fraction::operator%=(const Fraction& rhs) +{ + return *this = *this % rhs; +} + bool Sigcore::Fraction::operator==(const Fraction& rhs) const { return ((m_numerator * rhs.m_denominator) == (m_denominator * rhs.m_numerator)); |