Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Logic and performance fix (Fraction lib). #17

Merged
merged 4 commits into from
Mar 5, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 21 additions & 61 deletions libraries/Fraction/fraction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,55 +61,11 @@ Fraction::Fraction(double f)
}
}

Fraction::Fraction(int32_t p, int32_t q)
Fraction::Fraction(int32_t p, int32_t q) : n(p), d(q)
{
n = p;
d = q;
simplify();
}

Fraction::Fraction(int32_t p)
{
n = p;
d = 1;
}

Fraction::Fraction(int16_t p)
{
n = p;
d = 1;
}

Fraction::Fraction(int8_t p)
{
n = p;
d = 1;
}

Fraction::Fraction(uint32_t p)
{
n = p;
d = 1;
}

Fraction::Fraction(uint16_t p)
{
n = p;
d = 1;
}

Fraction::Fraction(uint8_t p)
{
n = p;
d = 1;
}

Fraction::Fraction(const Fraction &f)
{
n = f.n;
d = f.d;
}

// PRINTING
size_t Fraction::printTo(Print& p) const
{
Expand All @@ -128,32 +84,32 @@ size_t Fraction::printTo(Print& p) const
};

// EQUALITIES
bool Fraction::operator == (Fraction c)
bool Fraction::operator == (const Fraction &c)
{
return (n * c.d) == (d * c.n);
}

bool Fraction::operator != (Fraction c)
bool Fraction::operator != (const Fraction &c)
{
return (n * c.d) != (d * c.n);
}

bool Fraction::operator > (Fraction c)
bool Fraction::operator > (const Fraction &c)
{
return (n * c.d) > (d * c.n);
}

bool Fraction::operator >= (Fraction c)
bool Fraction::operator >= (const Fraction &c)
{
return (n * c.d) >= (d * c.n);
}

bool Fraction::operator < (Fraction c)
bool Fraction::operator < (const Fraction &c)
{
return (n * c.d) < (d * c.n);
}

bool Fraction::operator <= (Fraction c)
bool Fraction::operator <= (const Fraction &c)
{
return (n * c.d) <= (d * c.n);
}
Expand All @@ -165,7 +121,7 @@ Fraction Fraction::operator - ()
}

// BASIC MATH
Fraction Fraction::operator + (Fraction c)
Fraction Fraction::operator + (const Fraction &c)
{
if (d == c.d)
{
Expand All @@ -174,7 +130,7 @@ Fraction Fraction::operator + (Fraction c)
return Fraction(n*c.d + c.n*d, d * c.d);
}

Fraction Fraction::operator - (Fraction c)
Fraction Fraction::operator - (const Fraction &c)
{
if (d == c.d)
{
Expand All @@ -183,18 +139,18 @@ Fraction Fraction::operator - (Fraction c)
return Fraction(n*c.d - c.n*d, d * c.d);
}

Fraction Fraction::operator * (Fraction c)
Fraction Fraction::operator * (const Fraction &c)
{
return Fraction(n * c.n, d * c.d);
}

Fraction Fraction::operator / (Fraction c)
Fraction Fraction::operator / (const Fraction &c)
{
// division by zero returns 0
return Fraction(n * c.d, d * c.n);
}

void Fraction::operator += (Fraction c)
Fraction& Fraction::operator += (const Fraction &c)
{
if (d == c.d)
{
Expand All @@ -206,9 +162,10 @@ void Fraction::operator += (Fraction c)
d *= c.d;
}
simplify();
return *this;
}

void Fraction::operator -= (Fraction c)
Fraction& Fraction::operator -= (const Fraction &c)
{
if (d == c.d)
{
Expand All @@ -220,21 +177,24 @@ void Fraction::operator -= (Fraction c)
d *= c.d;
}
simplify();
return *this;
}

void Fraction::operator *= (Fraction c)
Fraction& Fraction::operator *= (const Fraction &c)
{
n *= c.n;
d *= c.d;
simplify();
return *this;
}

void Fraction::operator /= (Fraction c)
Fraction& Fraction::operator /= (const Fraction &c)
{
// division by zero returns 0
n *= c.d;
d *= c.n;
simplify();
return *this;
}

double Fraction::toDouble()
Expand Down Expand Up @@ -267,14 +227,14 @@ double Fraction::toAngle()

// the mediant is a fraction that is always between 2 fractions
// at least if within precission.
Fraction Fraction::mediant(Fraction a, Fraction b)
Fraction Fraction::mediant(const Fraction &a, const Fraction &b)
{
return Fraction(a.n + b.n, a.d + b.d);
}

// approximate a fraction with defined denominator
// sort of setDenominator(uint16_t den);
Fraction Fraction::setDenominator(Fraction a, uint16_t b)
Fraction Fraction::setDenominator(const Fraction &a, uint16_t b)
{
int32_t n = round((a.n * b * 1.0) / a.d);
int32_t d = b;
Expand Down
48 changes: 24 additions & 24 deletions libraries/Fraction/fraction.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,48 +20,48 @@ class Fraction: public Printable
public:
Fraction(double);
Fraction(int32_t, int32_t);
Fraction(int32_t);
Fraction(int16_t);
Fraction(int8_t);
Fraction(uint32_t);
Fraction(uint16_t);
Fraction(uint8_t);
Fraction(const Fraction&);
Fraction(int32_t p) : n(p), d(1) {}
Fraction(int16_t p) : n(p), d(1) {}
Fraction(int8_t p) : n(p), d(1) {}
Fraction(uint32_t p) : n(p), d(1) {}
Fraction(uint16_t p) : n(p), d(1) {}
Fraction(uint8_t p) : n(p), d(1) {}
Fraction(const Fraction &f) : n(f.n), d(f.d) {}

size_t printTo(Print& p) const;

// equalities
bool operator == (Fraction);
bool operator != (Fraction);
bool operator > (Fraction);
bool operator >= (Fraction);
bool operator < (Fraction);
bool operator <= (Fraction);
bool operator == (const Fraction&);
bool operator != (const Fraction&);
bool operator > (const Fraction&);
bool operator >= (const Fraction&);
bool operator < (const Fraction&);
bool operator <= (const Fraction&);

// negation
Fraction operator - ();

// basic math
Fraction operator + (Fraction);
Fraction operator - (Fraction);
Fraction operator * (Fraction);
Fraction operator / (Fraction);
Fraction operator + (const Fraction&);
Fraction operator - (const Fraction&);
Fraction operator * (const Fraction&);
Fraction operator / (const Fraction&);

void operator += (Fraction);
void operator -= (Fraction);
void operator *= (Fraction);
void operator /= (Fraction);
Fraction& operator += (const Fraction&);
Fraction& operator -= (const Fraction&);
Fraction& operator *= (const Fraction&);
Fraction& operator /= (const Fraction&);

double toDouble();
bool isProper(); // abs(f) < 1
double toAngle();

static Fraction mediant(Fraction, Fraction);
static Fraction mediant(const Fraction&, const Fraction&);
// approximate a fraction with defined denominator
static Fraction setDenominator(Fraction, uint16_t);
static Fraction setDenominator(const Fraction&, uint16_t);


private:
protected:
void simplify();
double fractionize(double);
int32_t gcd(int32_t, int32_t);
Expand Down