Numworks Epsilon  1.4.1
Graphing Calculator Operating System
rational.h
Go to the documentation of this file.
1 #ifndef POINCARE_RATIONAL_H
2 #define POINCARE_RATIONAL_H
3 
4 #include <poincare/integer.h>
6 #include <poincare/complex.h>
7 
8 namespace Poincare {
9 
10 class Rational : public StaticHierarchy<0> {
11  friend class Power;
12  friend class Multiplication;
13 public:
14  /* The constructor build a irreductible fraction whose sign is on numerator */
16  Rational(const Integer numerator);
19 
20  Rational(const Rational & other);
21  Rational & operator=(const Rational & other);
22  // Getter
23  const Integer numerator() const;
24  const Integer denominator() const;
25  // Expression subclassing
26  Type type() const override;
27  Expression * clone() const override;
28  Sign sign() const override;
29  Expression * cloneDenominator(Context & context, AngleUnit angleUnit) const override;
30 
31  // Basic test
32  bool isZero() const { return m_numerator.isZero(); }
33  bool isOne() const { return m_numerator.isOne() && m_denominator.isOne(); }
34  bool isMinusOne() const { return m_numerator.isMinusOne() && m_denominator.isOne(); }
35  bool isHalf() const { return m_numerator.isOne() && m_denominator.isTwo(); }
36  bool isMinusHalf() const { return m_numerator.isMinusOne() && m_denominator.isTwo(); }
37  bool isTen() const { return m_numerator.isTen() && m_denominator.isOne(); }
38 
39  // Arithmetic
40  static Rational Addition(const Rational & i, const Rational & j);
41  static Rational Multiplication(const Rational & i, const Rational & j);
42  static Rational Power(const Rational & i, const Integer & j);
43  static int NaturalOrder(const Rational & i, const Rational & j);
44 private:
45  bool needParenthesisWithParent(const Expression * e) const override;
46  ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override;
47  int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override;
48  Expression * privateApproximate(SinglePrecision p, Context& context, AngleUnit angleUnit) const override { return templatedApproximate<float>(context, angleUnit); }
49  Expression * privateApproximate(DoublePrecision p, Context& context, AngleUnit angleUnit) const override { return templatedApproximate<double>(context, angleUnit); }
50  template<typename U> Complex<U> * templatedApproximate(Context& context, Expression::AngleUnit angleUnit) const;
51  Expression * shallowBeautify(Context & context, AngleUnit angleUnit) override;
52  Expression * setSign(Sign s);
53  Expression * setSign(Sign s, Context & context, AngleUnit angleUnit) override {
54  return setSign(s);
55  }
56 
57  /* Sorting */
58  int simplificationOrderSameType(const Expression * e, bool canBeInterrupted) const override;
59 
60  Integer m_numerator;
61  Integer m_denominator;
62 };
63 
64 }
65 
66 #endif
int32_t native_int_t
Definition: integer.h:18
bool isZero() const
Definition: integer.h:72
friend class Multiplication
Definition: rational.h:12
bool isMinusOne() const
Definition: rational.h:34
static Rational Addition(const Rational &i, const Rational &j)
Definition: rational.cpp:104
Rational(Integer::native_int_t i)
Definition: rational.h:17
bool isOne() const
Definition: rational.h:33
Rational(const Integer numerator, const Integer denominator)
Definition: rational.cpp:17
Rational & operator=(const Rational &other)
Definition: rational.cpp:47
bool isTwo() const
Definition: integer.h:69
const Integer denominator() const
Definition: rational.cpp:59
Sign sign() const override
Definition: rational.cpp:72
bool isHalf() const
Definition: rational.h:35
bool isTen() const
Definition: rational.h:37
bool isTen() const
Definition: integer.h:70
Type type() const override
Definition: rational.cpp:64
static int NaturalOrder(const Rational &i, const Rational &j)
Definition: rational.cpp:127
const Integer numerator() const
Definition: rational.cpp:55
bool isOne() const
Definition: integer.h:68
Expression * cloneDenominator(Context &context, AngleUnit angleUnit) const override
Definition: rational.cpp:95
bool isMinusHalf() const
Definition: rational.h:36
bool isZero() const
Definition: rational.h:32
Expression * clone() const override
Definition: rational.cpp:68
bool isMinusOne() const
Definition: integer.h:71
friend class Power
Definition: rational.h:11
Rational(Integer::native_int_t i, Integer::native_int_t j)
Definition: rational.h:18