diff options
| author | Ben Boeckel <MathStuf@gmail.com> | 2008-10-17 05:46:40 +0000 |
|---|---|---|
| committer | Ben Boeckel <MathStuf@gmail.com> | 2008-10-17 05:46:40 +0000 |
| commit | b3e1495f7a626bb4429ff5e4f3ad39ae9654f23b (patch) | |
| tree | 8a188df964484e7dcf630e792dccfa1766c2f8f0 /sigcore/Fraction.cpp | |
| parent | 47428274a07bce9be5e62f82aeeb7e57aa21037f (diff) | |
[FIX] Moved Hat, Fraction, Matrix, and Script to sigcore
git-svn-id: https://pokegen.svn.sourceforge.net/svnroot/pokegen/trunk@281 6ecfd1a5-f3ed-3746-8530-beee90d26b22
Diffstat (limited to 'sigcore/Fraction.cpp')
| -rw-r--r-- | sigcore/Fraction.cpp | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/sigcore/Fraction.cpp b/sigcore/Fraction.cpp new file mode 100644 index 00000000..f5e5e3a3 --- /dev/null +++ b/sigcore/Fraction.cpp @@ -0,0 +1,177 @@ +/* + * Copyright 2007-2008 Ben Boeckel <MathStuf@gmail.com> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +/** + * \file sigcore/Fraction.cpp + */ + +// Header include +#include "Fraction.h" + +Sigcore::Fraction::Fraction(const int numerator, const int denominator) +{ + set(numerator, denominator); +} + +Sigcore::Fraction::Fraction(const Fraction& fraction) +{ + set(fraction.numerator(), fraction.denominator()); +} + +void Sigcore::Fraction::set(const int numerator, const int denominator) +{ + m_numerator = numerator; + m_denominator = denominator; + normalize(); +} + +void Sigcore::Fraction::setNumerator(const int numerator) +{ + set(numerator, m_denominator); +} + +void Sigcore::Fraction::setDenominator(const int denominator) +{ + set(m_numerator, denominator); +} + +int Sigcore::Fraction::numerator() const +{ + return m_numerator; +} + +int Sigcore::Fraction::denominator() const +{ + return m_denominator; +} + +void Sigcore::Fraction::reduce() +{ + if (!m_numerator || !m_denominator) + return; + int i = m_numerator; + int j = m_denominator; + if (i < 0) + i = -i; + while (i - j) + (i > j) ? (i -= j) : (j -= i); + m_numerator /= i; + m_denominator /= i; +} + +bool Sigcore::Fraction::poll() const +{ + return (qrand() % m_denominator) < m_numerator; +} + +bool Sigcore::Fraction::poll(const int numerator, const int denominator) +{ + return (qrand() % denominator) < numerator; +} + +Sigcore::Fraction& Sigcore::Fraction::operator=(const Fraction& rhs) +{ + if (this == &rhs) + return *this; + m_numerator = rhs.m_numerator; + m_denominator = rhs.m_denominator; + return *this; +} + +Sigcore::Fraction::operator double() const +{ + return (double(m_numerator) / m_denominator); +} + +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); +} + +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); +} + +Sigcore::Fraction Sigcore::Fraction::operator*(const Fraction& rhs) const +{ + return Fraction(m_numerator * rhs.m_numerator, m_denominator * rhs.m_denominator); +} + +Sigcore::Fraction Sigcore::Fraction::operator/(const Fraction& rhs) const +{ + return Fraction(m_numerator * rhs.m_denominator, m_denominator * rhs.m_numerator); +} + +Sigcore::Fraction& Sigcore::Fraction::operator+=(const Fraction& rhs) +{ + return *this = *this + rhs; +} + +Sigcore::Fraction& Sigcore::Fraction::operator-=(const Fraction& rhs) +{ + return *this = *this - rhs; +} + +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)); +} + +bool Sigcore::Fraction::operator!=(const Fraction& rhs) const +{ + return !(*this == rhs); +} + +bool Sigcore::Fraction::operator<(const Fraction& rhs) const +{ + return ((m_numerator * rhs.m_denominator) < (m_denominator * rhs.m_numerator)); +} + +bool Sigcore::Fraction::operator<=(const Fraction& rhs) const +{ + return ((m_numerator * rhs.m_denominator) <= (m_denominator * rhs.m_numerator)); +} + +bool Sigcore::Fraction::operator>(const Fraction& rhs) const +{ + return !(*this <= rhs); +} + +bool Sigcore::Fraction::operator>=(const Fraction& rhs) const +{ + return !(*this < rhs); +} + +void Sigcore::Fraction::normalize() +{ + if (m_denominator < 0) + { + m_denominator = -m_denominator; + m_numerator = -m_numerator; + } +} |
