mirror of
https://github.com/RobTillaart/Arduino.git
synced 2024-09-19 16:46:11 -04:00
+ initial version 0.1.00
This commit is contained in:
parent
33843c68ba
commit
a5469cdd24
241
libraries/Fraction/fraction.cpp
Normal file
241
libraries/Fraction/fraction.cpp
Normal file
@ -0,0 +1,241 @@
|
||||
//
|
||||
// FILE: fraction.h
|
||||
// AUTHOR: Rob Tillaart
|
||||
// VERSION: 0.1.00
|
||||
// PURPOSE: library for fractions for Arduino
|
||||
// URL:
|
||||
//
|
||||
// Released to the public domain
|
||||
//
|
||||
// TODO
|
||||
// - negative fractions
|
||||
// - divide by zero errors
|
||||
// - test extensively
|
||||
// - better print output for whole numbers?
|
||||
|
||||
#include "fraction.h"
|
||||
|
||||
Fraction::Fraction(double f)
|
||||
{
|
||||
if (f == 0.0)
|
||||
{
|
||||
n = 0;
|
||||
d = 1;
|
||||
return;
|
||||
}
|
||||
// Normalize
|
||||
bool neg = f < 0;
|
||||
if (neg) f = -f;
|
||||
bool rec = f > 1;
|
||||
if (rec) f = 1/f;
|
||||
|
||||
fractionize(f);
|
||||
simplify();
|
||||
|
||||
if (neg) n = -n;
|
||||
if (rec)
|
||||
{
|
||||
int32_t t = n;
|
||||
n = d;
|
||||
d = t;
|
||||
}
|
||||
}
|
||||
|
||||
Fraction::Fraction(int32_t p, int32_t q)
|
||||
{
|
||||
if (p == 0)
|
||||
{
|
||||
n = 0;
|
||||
d = 1;
|
||||
return;
|
||||
}
|
||||
n = abs(p);
|
||||
d = abs(q);
|
||||
simplify();
|
||||
// get sign right
|
||||
if ((p<0) != (q<0)) n = -n;
|
||||
}
|
||||
|
||||
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(const Fraction &f)
|
||||
{
|
||||
n = f.n;
|
||||
d = f.d;
|
||||
}
|
||||
|
||||
|
||||
// PRINTING
|
||||
size_t Fraction::printTo(Print& p) const
|
||||
{
|
||||
size_t s = 0;
|
||||
s += p.print(n, DEC);
|
||||
s += p.print('/');
|
||||
s += p.print(d, DEC);
|
||||
return s;
|
||||
};
|
||||
|
||||
// EQUALITIES
|
||||
bool Fraction::operator == (Fraction c)
|
||||
{
|
||||
return (n == c.n) && (d == c.d);
|
||||
}
|
||||
|
||||
bool Fraction::operator != (Fraction c)
|
||||
{
|
||||
return (n != c.n) || (d != c.d);
|
||||
}
|
||||
|
||||
bool Fraction::operator > (Fraction c)
|
||||
{
|
||||
return (n * c.d) > (d * c.n);
|
||||
}
|
||||
|
||||
bool Fraction::operator >= (Fraction c)
|
||||
{
|
||||
return (n * c.d) >= (d * c.n);
|
||||
}
|
||||
|
||||
bool Fraction::operator < (Fraction c)
|
||||
{
|
||||
return (n * c.d) < (d * c.n);
|
||||
}
|
||||
|
||||
bool Fraction::operator <= (Fraction c)
|
||||
{
|
||||
return (n * c.d) <= (d * c.n);
|
||||
}
|
||||
|
||||
// NEGATE
|
||||
Fraction Fraction::operator - ()
|
||||
{
|
||||
return Fraction(-d, n);
|
||||
}
|
||||
|
||||
// BASIC MATH
|
||||
Fraction Fraction::operator + (Fraction c)
|
||||
{
|
||||
if (d == c.d) return Fraction(n + c.n, d);
|
||||
int32_t dd = d * c.d;
|
||||
return Fraction(n*c.d + c.n*d, dd);
|
||||
}
|
||||
|
||||
Fraction Fraction::operator - (Fraction c)
|
||||
{
|
||||
if (d == c.d) return Fraction(n - c.n, d);
|
||||
int32_t dd = d * c.d;
|
||||
return Fraction(n*c.d - c.n*d, dd);
|
||||
}
|
||||
|
||||
Fraction Fraction::operator * (Fraction c)
|
||||
{
|
||||
return Fraction(n*c.n, d*c.d);
|
||||
}
|
||||
|
||||
Fraction Fraction::operator / (Fraction c)
|
||||
{
|
||||
return Fraction(n*c.d, d*c.n);
|
||||
}
|
||||
|
||||
void Fraction::operator += (Fraction c)
|
||||
{
|
||||
if (d == c.d)
|
||||
{
|
||||
n += c.n;
|
||||
return;
|
||||
}
|
||||
n = n * c.d + c.n * d;
|
||||
d *= c.d;
|
||||
}
|
||||
|
||||
void Fraction::operator -= (Fraction c)
|
||||
{
|
||||
if (d == c.d)
|
||||
{
|
||||
n -= c.n;
|
||||
return;
|
||||
}
|
||||
n = n * c.d - c.n * d;
|
||||
d *= c.d;
|
||||
}
|
||||
|
||||
void Fraction::operator *= (Fraction c)
|
||||
{
|
||||
n *= c.n;
|
||||
d *= c.d;
|
||||
}
|
||||
|
||||
void Fraction::operator /= (Fraction c)
|
||||
{
|
||||
n *= c.d;
|
||||
d *= c.n;
|
||||
}
|
||||
|
||||
// PRIVATE
|
||||
int32_t Fraction::gcd(int32_t a , int32_t b)
|
||||
{
|
||||
long c;
|
||||
while ( a != 0 )
|
||||
{
|
||||
c = a;
|
||||
a = b % a;
|
||||
b = c;
|
||||
}
|
||||
return b;
|
||||
}
|
||||
|
||||
// not that simple ...
|
||||
void Fraction::simplify()
|
||||
{
|
||||
int32_t x = gcd(n, d);
|
||||
n = n/x;
|
||||
d = d/x;
|
||||
while (d > 10000)
|
||||
{
|
||||
n = round(n * 0.1);
|
||||
d = round(d * 0.1);
|
||||
x = gcd(n, d);
|
||||
n = n/x;
|
||||
d = d/x;
|
||||
}
|
||||
}
|
||||
|
||||
// PRE: 0 <= f < 1.0
|
||||
double Fraction::fractionize(double f)
|
||||
{
|
||||
long nn = 1, dd = 1;
|
||||
|
||||
float r = 1 / f;
|
||||
float delta = f * dd - nn;
|
||||
float mindelta = 1;
|
||||
while (abs(delta) > 0.00001)
|
||||
{
|
||||
dd++;
|
||||
if (delta < 0)
|
||||
{
|
||||
nn++;
|
||||
dd = nn * r;
|
||||
}
|
||||
delta = f * dd - nn;
|
||||
}
|
||||
n = nn;
|
||||
d = dd;
|
||||
return delta;
|
||||
}
|
||||
// --- END OF FILE ---
|
60
libraries/Fraction/fraction.h
Normal file
60
libraries/Fraction/fraction.h
Normal file
@ -0,0 +1,60 @@
|
||||
//
|
||||
// FILE: fraction.h
|
||||
// AUTHOR: Rob Tillaart
|
||||
// VERSION: 0.1.00
|
||||
// PURPOSE: demo library for fractions for Arduino
|
||||
// URL:
|
||||
//
|
||||
// Released to the public domain
|
||||
//
|
||||
|
||||
#ifndef Fraction_h
|
||||
#define Fraction_h
|
||||
|
||||
#include "Arduino.h"
|
||||
|
||||
#define FRACTIONLIBVERSION "0.1.00"
|
||||
|
||||
class Fraction: public Printable
|
||||
{
|
||||
public:
|
||||
|
||||
Fraction(double);
|
||||
Fraction(int32_t, int32_t);
|
||||
Fraction(int32_t);
|
||||
Fraction(int16_t);
|
||||
Fraction(int8_t);
|
||||
Fraction(const Fraction&);
|
||||
|
||||
size_t printTo(Print& p) const;
|
||||
|
||||
bool operator == (Fraction);
|
||||
bool operator != (Fraction);
|
||||
bool operator > (Fraction);
|
||||
bool operator >= (Fraction);
|
||||
bool operator < (Fraction);
|
||||
bool operator <= (Fraction);
|
||||
|
||||
Fraction operator - (); // negation
|
||||
|
||||
Fraction operator + (Fraction);
|
||||
Fraction operator - (Fraction);
|
||||
Fraction operator * (Fraction);
|
||||
Fraction operator / (Fraction);
|
||||
|
||||
void operator += (Fraction);
|
||||
void operator -= (Fraction);
|
||||
void operator *= (Fraction);
|
||||
void operator /= (Fraction);
|
||||
|
||||
private:
|
||||
void simplify();
|
||||
double fractionize(double);
|
||||
int32_t gcd(int32_t, int32_t);
|
||||
|
||||
int32_t n;
|
||||
int32_t d;
|
||||
};
|
||||
|
||||
#endif
|
||||
// -- END OF FILE --
|
Loading…
Reference in New Issue
Block a user