From ce66a582b67710b3f9df7cbc0c4cbe0ed1bb08f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Thu, 9 Mar 2017 16:33:52 +0100 Subject: [PATCH] [poincare] parse acos, asin, atan Change-Id: I1f6c3566315cbe21b5a46c79f3e9dee5123432bb --- poincare/Makefile | 3 +++ poincare/include/poincare.h | 3 +++ poincare/include/poincare/arc_cosine.h | 20 ++++++++++++++ poincare/include/poincare/arc_sine.h | 20 ++++++++++++++ poincare/include/poincare/arc_tangent.h | 20 ++++++++++++++ poincare/include/poincare/expression.h | 3 +++ poincare/src/arc_cosine.cpp | 35 +++++++++++++++++++++++++ poincare/src/arc_sine.cpp | 35 +++++++++++++++++++++++++ poincare/src/arc_tangent.cpp | 35 +++++++++++++++++++++++++ poincare/src/expression_lexer.l | 3 +++ 10 files changed, 177 insertions(+) create mode 100644 poincare/include/poincare/arc_cosine.h create mode 100644 poincare/include/poincare/arc_sine.h create mode 100644 poincare/include/poincare/arc_tangent.h create mode 100644 poincare/src/arc_cosine.cpp create mode 100644 poincare/src/arc_sine.cpp create mode 100644 poincare/src/arc_tangent.cpp diff --git a/poincare/Makefile b/poincare/Makefile index 4becc0aef..a8b50cf51 100644 --- a/poincare/Makefile +++ b/poincare/Makefile @@ -5,6 +5,9 @@ include poincare/src/simplify/Makefile objs += $(addprefix poincare/src/,\ absolute_value.o\ addition.o\ + arc_cosine.o\ + arc_sine.o\ + arc_tangent.o\ binary_operation.o\ binomial_coefficient.o\ ceiling.o\ diff --git a/poincare/include/poincare.h b/poincare/include/poincare.h index 861760a73..f91efdd49 100644 --- a/poincare/include/poincare.h +++ b/poincare/include/poincare.h @@ -3,6 +3,9 @@ #include #include +#include +#include +#include #include #include #include diff --git a/poincare/include/poincare/arc_cosine.h b/poincare/include/poincare/arc_cosine.h new file mode 100644 index 000000000..52516ad9d --- /dev/null +++ b/poincare/include/poincare/arc_cosine.h @@ -0,0 +1,20 @@ +#ifndef POINCARE_ARC_COSINE_H +#define POINCARE_ARC_COSINE_H + +#include + +namespace Poincare { + +class ArcCosine : public Function { +public: + ArcCosine(); + Type type() const override; + Expression * cloneWithDifferentOperands(Expression ** newOperands, + int numberOfOperands, bool cloneOperands = true) const override; +private: + float privateApproximate(Context & context, AngleUnit angleUnit) const override; +}; + +} + +#endif diff --git a/poincare/include/poincare/arc_sine.h b/poincare/include/poincare/arc_sine.h new file mode 100644 index 000000000..ad77b737e --- /dev/null +++ b/poincare/include/poincare/arc_sine.h @@ -0,0 +1,20 @@ +#ifndef POINCARE_ARC_SINE_H +#define POINCARE_ARC_SINE_H + +#include + +namespace Poincare { + +class ArcSine : public Function { +public: + ArcSine(); + Type type() const override; + Expression * cloneWithDifferentOperands(Expression ** newOperands, + int numberOfOperands, bool cloneOperands = true) const override; +private: + float privateApproximate(Context & context, AngleUnit angleUnit) const override; +}; + +} + +#endif diff --git a/poincare/include/poincare/arc_tangent.h b/poincare/include/poincare/arc_tangent.h new file mode 100644 index 000000000..cf158f7df --- /dev/null +++ b/poincare/include/poincare/arc_tangent.h @@ -0,0 +1,20 @@ +#ifndef POINCARE_ARC_TANGENT_H +#define POINCARE_ARC_TANGENT_H + +#include + +namespace Poincare { + +class ArcTangent: public Function { +public: + ArcTangent(); + Type type() const override; + Expression * cloneWithDifferentOperands(Expression ** newOperands, + int numberOfOperands, bool cloneOperands = true) const override; +private: + float privateApproximate(Context & context, AngleUnit angleUnit) const override; +}; + +} + +#endif diff --git a/poincare/include/poincare/expression.h b/poincare/include/poincare/expression.h index b00877d41..aa01c7636 100644 --- a/poincare/include/poincare/expression.h +++ b/poincare/include/poincare/expression.h @@ -13,6 +13,9 @@ public: enum class Type : uint8_t { AbsoluteValue, Addition, + ArcCosine, + ArcSine, + ArcTangent, BinomialCoefficient, Ceiling, Complex, diff --git a/poincare/src/arc_cosine.cpp b/poincare/src/arc_cosine.cpp new file mode 100644 index 000000000..de3519f9b --- /dev/null +++ b/poincare/src/arc_cosine.cpp @@ -0,0 +1,35 @@ +#include +extern "C" { +#include +#include +} + +namespace Poincare { + +ArcCosine::ArcCosine() : + Function("acos") +{ +} + +Expression::Type ArcCosine::type() const { + return Type::ArcCosine; +} + +Expression * ArcCosine::cloneWithDifferentOperands(Expression** newOperands, + int numberOfOperands, bool cloneOperands) const { + assert(numberOfOperands == 1); + assert(newOperands != nullptr); + ArcCosine * c = new ArcCosine(); + c->setArgument(newOperands, numberOfOperands, cloneOperands); + return c; +} + +float ArcCosine::privateApproximate(Context& context, AngleUnit angleUnit) const { + assert(angleUnit != AngleUnit::Default); + if (angleUnit == AngleUnit::Degree) { + return acosf(m_args[0]->approximate(context, angleUnit))*180.0f/M_PI; + } + return acosf(m_args[0]->approximate(context, angleUnit)); +} + +} diff --git a/poincare/src/arc_sine.cpp b/poincare/src/arc_sine.cpp new file mode 100644 index 000000000..f0bacfca1 --- /dev/null +++ b/poincare/src/arc_sine.cpp @@ -0,0 +1,35 @@ +#include +extern "C" { +#include +#include +} + +namespace Poincare { + +ArcSine::ArcSine() : + Function("asin") +{ +} + +Expression::Type ArcSine::type() const { + return Type::ArcSine; +} + +Expression * ArcSine::cloneWithDifferentOperands(Expression** newOperands, + int numberOfOperands, bool cloneOperands) const { + assert(numberOfOperands == 1); + assert(newOperands != nullptr); + ArcSine * s = new ArcSine(); + s->setArgument(newOperands, numberOfOperands, cloneOperands); + return s; +} + +float ArcSine::privateApproximate(Context& context, AngleUnit angleUnit) const { + assert(angleUnit != AngleUnit::Default); + if (angleUnit == AngleUnit::Degree) { + return asinf(m_args[0]->approximate(context, angleUnit))*180.0f/M_PI; + } + return asinf(m_args[0]->approximate(context, angleUnit)); +} + +} diff --git a/poincare/src/arc_tangent.cpp b/poincare/src/arc_tangent.cpp new file mode 100644 index 000000000..3dea3c6c4 --- /dev/null +++ b/poincare/src/arc_tangent.cpp @@ -0,0 +1,35 @@ +#include +extern "C" { +#include +#include +} + +namespace Poincare { + +ArcTangent::ArcTangent() : + Function("atan") +{ +} + +Expression::Type ArcTangent::type() const { + return Type::ArcTangent; +} + +Expression * ArcTangent::cloneWithDifferentOperands(Expression** newOperands, + int numberOfOperands, bool cloneOperands) const { + assert(numberOfOperands == 1); + assert(newOperands != nullptr); + ArcTangent * t = new ArcTangent(); + t->setArgument(newOperands, numberOfOperands, cloneOperands); + return t; +} + +float ArcTangent::privateApproximate(Context& context, AngleUnit angleUnit) const { + assert(angleUnit != AngleUnit::Default); + if (angleUnit == AngleUnit::Degree) { + return atanf(m_args[0]->approximate(context, angleUnit))*180.0f/M_PI; + } + return atanf(m_args[0]->approximate(context, angleUnit)); +} + +} diff --git a/poincare/src/expression_lexer.l b/poincare/src/expression_lexer.l index e009d9324..9801ef1a3 100644 --- a/poincare/src/expression_lexer.l +++ b/poincare/src/expression_lexer.l @@ -89,9 +89,12 @@ v\(n\) { poincare_expression_yylval.character = Symbol::SpecialSymbols::vn; retu v\(n\+1\) { poincare_expression_yylval.character = Symbol::SpecialSymbols::vn1; return SYMBOL; } w\(n\) { poincare_expression_yylval.character = Symbol::SpecialSymbols::wn; return SYMBOL; } w\(n\+1\) { poincare_expression_yylval.character = Symbol::SpecialSymbols::wn1; return SYMBOL; } +acos { poincare_expression_yylval.expression = new ArcCosine(); return FUNCTION; } abs { poincare_expression_yylval.expression = new AbsoluteValue(); return FUNCTION; } ans { poincare_expression_yylval.character = Symbol::SpecialSymbols::Ans; return SYMBOL; } arg { poincare_expression_yylval.expression = new ComplexArgument(); return FUNCTION; } +asin { poincare_expression_yylval.expression = new ArcSine(); return FUNCTION; } +atan { poincare_expression_yylval.expression = new ArcTangent(); return FUNCTION; } binomial { poincare_expression_yylval.expression = new BinomialCoefficient(); return FUNCTION; } ceil { poincare_expression_yylval.expression = new Ceiling(); return FUNCTION; } diff { poincare_expression_yylval.expression = new Derivative(); return FUNCTION; }