summaryrefslogtreecommitdiffstats
path: root/sigcore
diff options
context:
space:
mode:
authorBen Boeckel <MathStuf@gmail.com>2008-12-16 20:08:40 -0500
committerBen Boeckel <MathStuf@gmail.com>2008-12-16 20:08:40 -0500
commit36110d3c54b7bfb0878816a0b96c9075e2b1814f (patch)
treef6a6fab540bd6309b779582d64d15ee69da1c4fb /sigcore
parent9e0e72b5256a936fa99d5b1dc4790f97b575a54e (diff)
downloadsigen-36110d3c54b7bfb0878816a0b96c9075e2b1814f.tar.gz
sigen-36110d3c54b7bfb0878816a0b96c9075e2b1814f.tar.xz
sigen-36110d3c54b7bfb0878816a0b96c9075e2b1814f.zip
Added modulo operation to Fraction
Diffstat (limited to 'sigcore')
-rw-r--r--sigcore/Fraction.cpp33
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));