diff --git a/poincare/Makefile b/poincare/Makefile index 759e538ad..aec11f95f 100644 --- a/poincare/Makefile +++ b/poincare/Makefile @@ -24,6 +24,7 @@ objs += $(addprefix poincare/src/,\ matrix.o\ matrix_data.o\ multiplication.o\ + naperian_logarithm.o\ n_context.o\ nth_root.o\ opposite.o\ diff --git a/poincare/include/poincare.h b/poincare/include/poincare.h index 5ee726d56..387efde16 100644 --- a/poincare/include/poincare.h +++ b/poincare/include/poincare.h @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include diff --git a/poincare/include/poincare/expression.h b/poincare/include/poincare/expression.h index 190400e78..238fbabab 100644 --- a/poincare/include/poincare/expression.h +++ b/poincare/include/poincare/expression.h @@ -20,6 +20,7 @@ class Expression { Logarithm, Matrix, Multiplication, + NaperianLogarithm, NthRoot, Opposite, Fraction, diff --git a/poincare/include/poincare/naperian_logarithm.h b/poincare/include/poincare/naperian_logarithm.h new file mode 100644 index 000000000..34bb9bef2 --- /dev/null +++ b/poincare/include/poincare/naperian_logarithm.h @@ -0,0 +1,15 @@ +#ifndef POINCARE_NAPERIAN_LOGARITHM_H +#define POINCARE_NAPERIAN_LOGARITHM_H + +#include + +class NaperianLogarithm : public Function { +public: + NaperianLogarithm(); + float approximate(Context & context) const override; + Type type() const override; + Expression * cloneWithDifferentOperands(Expression ** newOperands, + int numberOfOperands, bool cloneOperands = true) const override; +}; + +#endif diff --git a/poincare/src/expression_lexer.l b/poincare/src/expression_lexer.l index ad94d0ad4..008d34968 100644 --- a/poincare/src/expression_lexer.l +++ b/poincare/src/expression_lexer.l @@ -88,6 +88,7 @@ cos { poincare_expression_yylval.expression = new Cosine(); return FUNCTION; } int { poincare_expression_yylval.expression = new Integral(); return FUNCTION; } tan { poincare_expression_yylval.expression = new Tangent(); return FUNCTION; } log { poincare_expression_yylval.expression = new Logarithm(); return FUNCTION; } +ln { poincare_expression_yylval.expression = new NaperianLogarithm(); return FUNCTION; } root { poincare_expression_yylval.expression = new NthRoot(); return FUNCTION; } sum { poincare_expression_yylval.expression = new Sum(); return FUNCTION; } product { poincare_expression_yylval.expression = new Product(); return FUNCTION; } diff --git a/poincare/src/naperian_logarithm.cpp b/poincare/src/naperian_logarithm.cpp new file mode 100644 index 000000000..632df69c4 --- /dev/null +++ b/poincare/src/naperian_logarithm.cpp @@ -0,0 +1,31 @@ +#include +extern "C" { +#include +#include +#include +} +#include "layout/horizontal_layout.h" +#include "layout/parenthesis_layout.h" +#include "layout/string_layout.h" + +NaperianLogarithm::NaperianLogarithm() : + Function("ln") +{ +} + +Expression::Type NaperianLogarithm::type() const { + return Type::NaperianLogarithm; +} + +Expression * NaperianLogarithm::cloneWithDifferentOperands(Expression** newOperands, + int numberOfOperands, bool cloneOperands) const { + assert(numberOfOperands == 1 || numberOfOperands == 2); + assert(newOperands != nullptr); + NaperianLogarithm * l = new NaperianLogarithm(); + l->setArgument(newOperands, numberOfOperands, cloneOperands); + return l; +} + +float NaperianLogarithm::approximate(Context& context) const { + return log10f(m_args[0]->approximate(context))/log10f(M_E); +}