From db4dab9731786dc55e130dc1c965c3bb4572116a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Thu, 9 Mar 2017 16:55:56 +0100 Subject: [PATCH] [poincare] Parse acosh, asinh, atanh Change-Id: I4c0f965e9bb1738c017964b8664c7867e41c5339 --- poincare/Makefile | 3 ++ poincare/include/poincare.h | 3 ++ poincare/include/poincare/expression.h | 3 ++ .../include/poincare/hyperbolic_arc_cosine.h | 20 +++++++++++ .../include/poincare/hyperbolic_arc_sine.h | 20 +++++++++++ .../include/poincare/hyperbolic_arc_tangent.h | 20 +++++++++++ poincare/src/expression_lexer.l | 3 ++ poincare/src/hyperbolic_arc_cosine.cpp | 33 +++++++++++++++++++ poincare/src/hyperbolic_arc_sine.cpp | 33 +++++++++++++++++++ poincare/src/hyperbolic_arc_tangent.cpp | 33 +++++++++++++++++++ 10 files changed, 171 insertions(+) create mode 100644 poincare/include/poincare/hyperbolic_arc_cosine.h create mode 100644 poincare/include/poincare/hyperbolic_arc_sine.h create mode 100644 poincare/include/poincare/hyperbolic_arc_tangent.h create mode 100644 poincare/src/hyperbolic_arc_cosine.cpp create mode 100644 poincare/src/hyperbolic_arc_sine.cpp create mode 100644 poincare/src/hyperbolic_arc_tangent.cpp diff --git a/poincare/Makefile b/poincare/Makefile index a8b50cf51..77ee68a96 100644 --- a/poincare/Makefile +++ b/poincare/Makefile @@ -28,6 +28,9 @@ objs += $(addprefix poincare/src/,\ function.o\ global_context.o\ great_common_divisor.o\ + hyperbolic_arc_cosine.o\ + hyperbolic_arc_sine.o\ + hyperbolic_arc_tangent.o\ hyperbolic_cosine.o\ hyperbolic_sine.o\ hyperbolic_tangent.o\ diff --git a/poincare/include/poincare.h b/poincare/include/poincare.h index f91efdd49..0ff3fd55e 100644 --- a/poincare/include/poincare.h +++ b/poincare/include/poincare.h @@ -24,6 +24,9 @@ #include #include #include +#include +#include +#include #include #include #include diff --git a/poincare/include/poincare/expression.h b/poincare/include/poincare/expression.h index aa01c7636..6765e26a3 100644 --- a/poincare/include/poincare/expression.h +++ b/poincare/include/poincare/expression.h @@ -30,6 +30,9 @@ public: Floor, FracPart, GreatCommonDivisor, + HyperbolicArcCosine, + HyperbolicArcSine, + HyperbolicArcTangent, HyperbolicCosine, HyperbolicSine, HyperbolicTangent, diff --git a/poincare/include/poincare/hyperbolic_arc_cosine.h b/poincare/include/poincare/hyperbolic_arc_cosine.h new file mode 100644 index 000000000..1209410b5 --- /dev/null +++ b/poincare/include/poincare/hyperbolic_arc_cosine.h @@ -0,0 +1,20 @@ +#ifndef POINCARE_HYPERBOLIC_ARC_COSINE_H +#define POINCARE_HYPERBOLIC_ARC_COSINE_H + +#include + +namespace Poincare { + +class HyperbolicArcCosine : public Function { +public: + HyperbolicArcCosine(); + 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/hyperbolic_arc_sine.h b/poincare/include/poincare/hyperbolic_arc_sine.h new file mode 100644 index 000000000..007d892af --- /dev/null +++ b/poincare/include/poincare/hyperbolic_arc_sine.h @@ -0,0 +1,20 @@ +#ifndef POINCARE_HYPERBOLIC_ARC_SINE_H +#define POINCARE_HYPERBOLIC_ARC_SINE_H + +#include + +namespace Poincare { + +class HyperbolicArcSine : public Function { +public: + HyperbolicArcSine(); + 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/hyperbolic_arc_tangent.h b/poincare/include/poincare/hyperbolic_arc_tangent.h new file mode 100644 index 000000000..293440ad5 --- /dev/null +++ b/poincare/include/poincare/hyperbolic_arc_tangent.h @@ -0,0 +1,20 @@ +#ifndef POINCARE_HYPERBOLIC_ARC_TANGENT_H +#define POINCARE_HYPERBOLIC_ARC_TANGENT_H + +#include + +namespace Poincare { + +class HyperbolicArcTangent : public Function { +public: + HyperbolicArcTangent(); + 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/src/expression_lexer.l b/poincare/src/expression_lexer.l index 9801ef1a3..9aba18c22 100644 --- a/poincare/src/expression_lexer.l +++ b/poincare/src/expression_lexer.l @@ -90,11 +90,14 @@ v\(n\+1\) { poincare_expression_yylval.character = Symbol::SpecialSymbols::vn1; 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; } +acosh { poincare_expression_yylval.expression = new HyperbolicArcCosine(); 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; } +asinh { poincare_expression_yylval.expression = new HyperbolicArcSine(); return FUNCTION; } atan { poincare_expression_yylval.expression = new ArcTangent(); return FUNCTION; } +atanh { poincare_expression_yylval.expression = new HyperbolicArcTangent(); 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; } diff --git a/poincare/src/hyperbolic_arc_cosine.cpp b/poincare/src/hyperbolic_arc_cosine.cpp new file mode 100644 index 000000000..c24fa39da --- /dev/null +++ b/poincare/src/hyperbolic_arc_cosine.cpp @@ -0,0 +1,33 @@ +#include +extern "C" { +#include +#include +} + +namespace Poincare { + +HyperbolicArcCosine::HyperbolicArcCosine() : + Function("acosh") +{ +} + +Expression::Type HyperbolicArcCosine::type() const { + return Type::HyperbolicArcCosine; +} + +Expression * HyperbolicArcCosine::cloneWithDifferentOperands(Expression** newOperands, + int numberOfOperands, bool cloneOperands) const { + assert(numberOfOperands == 1); + assert(newOperands != nullptr); + HyperbolicArcCosine * c = new HyperbolicArcCosine(); + c->setArgument(newOperands, numberOfOperands, cloneOperands); + return c; +} + +float HyperbolicArcCosine::privateApproximate(Context& context, AngleUnit angleUnit) const { + assert(angleUnit != AngleUnit::Default); + float x = m_args[0]->approximate(context, angleUnit); + return logf(x+sqrtf(x*x-1.0f)); +} + +} diff --git a/poincare/src/hyperbolic_arc_sine.cpp b/poincare/src/hyperbolic_arc_sine.cpp new file mode 100644 index 000000000..f69ec268e --- /dev/null +++ b/poincare/src/hyperbolic_arc_sine.cpp @@ -0,0 +1,33 @@ +#include +extern "C" { +#include +#include +} + +namespace Poincare { + +HyperbolicArcSine::HyperbolicArcSine() : + Function("asinh") +{ +} + +Expression::Type HyperbolicArcSine::type() const { + return Type::HyperbolicArcSine; +} + +Expression * HyperbolicArcSine::cloneWithDifferentOperands(Expression** newOperands, + int numberOfOperands, bool cloneOperands) const { + assert(numberOfOperands == 1); + assert(newOperands != nullptr); + HyperbolicArcSine * s = new HyperbolicArcSine(); + s->setArgument(newOperands, numberOfOperands, cloneOperands); + return s; +} + +float HyperbolicArcSine::privateApproximate(Context& context, AngleUnit angleUnit) const { + assert(angleUnit != AngleUnit::Default); + float x = m_args[0]->approximate(context, angleUnit); + return logf(x+sqrtf(x*x+1.0f)); +} + +} diff --git a/poincare/src/hyperbolic_arc_tangent.cpp b/poincare/src/hyperbolic_arc_tangent.cpp new file mode 100644 index 000000000..891ef9ea7 --- /dev/null +++ b/poincare/src/hyperbolic_arc_tangent.cpp @@ -0,0 +1,33 @@ +#include +extern "C" { +#include +#include +} + +namespace Poincare { + +HyperbolicArcTangent::HyperbolicArcTangent() : + Function("atanh") +{ +} + +Expression::Type HyperbolicArcTangent::type() const { + return Type::HyperbolicArcTangent; +} + +Expression * HyperbolicArcTangent::cloneWithDifferentOperands(Expression** newOperands, + int numberOfOperands, bool cloneOperands) const { + assert(numberOfOperands == 1); + assert(newOperands != nullptr); + HyperbolicArcTangent * t = new HyperbolicArcTangent(); + t->setArgument(newOperands, numberOfOperands, cloneOperands); + return t; +} + +float HyperbolicArcTangent::privateApproximate(Context& context, AngleUnit angleUnit) const { + assert(angleUnit != AngleUnit::Default); + float x = m_args[0]->approximate(context, angleUnit); + return 0.5f*logf((1.0f+x)/(1.0f-x)); +} + +}