diff --git a/poincare/include/poincare/cosine.h b/poincare/include/poincare/cosine.h index 5855d8a9d..4abf06942 100644 --- a/poincare/include/poincare/cosine.h +++ b/poincare/include/poincare/cosine.h @@ -34,6 +34,10 @@ private: LayoutShape leftLayoutShape() const override { return LayoutShape::MoreLetters; }; LayoutShape rightLayoutShape() const override { return LayoutShape::BoundaryPunctuation; } + // Derivation + bool didDerivate(ReductionContext reductionContext, Expression symbol, Expression symbolValue) override; + Expression unaryFunctionDifferential() override; + // Evaluation Evaluation approximate(SinglePrecision p, Context * context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit) const override { return ApproximationHelper::Map(this, context, complexFormat, angleUnit,computeOnComplex); @@ -51,6 +55,9 @@ public: static constexpr Expression::FunctionHelper s_functionHelper = Expression::FunctionHelper("cos", 1, &UntypedBuilderOneChild); Expression shallowReduce(ExpressionNode::ReductionContext reductionContext); + + bool didDerivate(ExpressionNode::ReductionContext reductionContext, Expression symbol, Expression symbolValue); + Expression unaryFunctionDifferential(); }; } diff --git a/poincare/src/cosine.cpp b/poincare/src/cosine.cpp index 2e216ce8e..fdc195f55 100644 --- a/poincare/src/cosine.cpp +++ b/poincare/src/cosine.cpp @@ -1,7 +1,11 @@ #include #include +#include #include +#include +#include #include +#include #include @@ -34,6 +38,14 @@ Expression CosineNode::shallowReduce(ReductionContext reductionContext) { return Cosine(this).shallowReduce(reductionContext); } +bool CosineNode::didDerivate(ReductionContext reductionContext, Expression symbol, Expression symbolValue) { + return Cosine(this).didDerivate(reductionContext, symbol, symbolValue); +} + +Expression CosineNode::unaryFunctionDifferential() { + return Cosine(this).unaryFunctionDifferential(); +} + Expression Cosine::shallowReduce(ExpressionNode::ReductionContext reductionContext) { { Expression e = Expression::defaultShallowReduce(); @@ -45,5 +57,13 @@ Expression Cosine::shallowReduce(ExpressionNode::ReductionContext reductionConte return Trigonometry::shallowReduceDirectFunction(*this, reductionContext); } +bool Cosine::didDerivate(ExpressionNode::ReductionContext reductionContext, Expression symbol, Expression symbolValue) { + Derivative::DerivateUnaryFunction(*this, symbol, symbolValue); + return true; +} + +Expression Cosine::unaryFunctionDifferential() { + return Multiplication::Builder(Rational::Builder(-1), Sine::Builder(childAtIndex(0).clone())); +} } diff --git a/poincare/test/derivative.cpp b/poincare/test/derivative.cpp index 5567bf1a6..66ea36cb2 100644 --- a/poincare/test/derivative.cpp +++ b/poincare/test/derivative.cpp @@ -44,4 +44,6 @@ QUIZ_CASE(poicare_differential_unary_functions) { assert_parses_and_reduces_as("diff(sin(x),x,π)","-1"); assert_parses_and_reduces_as("diff(sin(2y),y,π/12)","√(3)"); assert_parses_and_reduces_as("diff(sin(2x)+sin(3x),x,π/6)","1"); + + assert_parses_and_reduces_as("diff(cos(x),x,π/2)","-1"); } \ No newline at end of file