diff --git a/apps/graph/app.h b/apps/graph/app.h index 4d214d542..ebbb14ea8 100644 --- a/apps/graph/app.h +++ b/apps/graph/app.h @@ -15,6 +15,10 @@ class App : public Shared::TextFieldDelegateApp { public: App(Container * container, Poincare::Context * context); InputViewController * inputViewController(); + /* This local context can parse x. However, it always stores NAN + * as x value. When we need to evaluate expression with a specific x value, we + * use a temporary local context (on the stack). That way, we avoid keeping + * weird x values after drawing curves or displaying the value table. */ Poincare::Context * localContext() override; private: CartesianFunctionStore m_functionStore; diff --git a/apps/shared/function.cpp b/apps/shared/function.cpp index f4e0d4cba..b9f379ede 100644 --- a/apps/shared/function.cpp +++ b/apps/shared/function.cpp @@ -75,10 +75,11 @@ void Function::setActive(bool active) { } float Function::evaluateAtAbscissa(float x, Poincare::Context * context) const { + Poincare::VariableContext variableContext = Poincare::VariableContext(symbol(), context); Poincare::Symbol xSymbol = Poincare::Symbol(symbol()); Poincare::Complex e = Poincare::Complex::Float(x); - context->setExpressionForSymbolName(&e, &xSymbol); - return m_expression->approximate(*context); + variableContext.setExpressionForSymbolName(&e, &xSymbol); + return m_expression->approximate(variableContext); } } diff --git a/poincare/src/variable_context.cpp b/poincare/src/variable_context.cpp index 5c6df6ac5..d8a0bc9ed 100644 --- a/poincare/src/variable_context.cpp +++ b/poincare/src/variable_context.cpp @@ -6,7 +6,7 @@ namespace Poincare { VariableContext::VariableContext(char name, Context * parentContext) : m_name(name), - m_value(Complex::Float(0.0f)), + m_value(Complex::Float(NAN)), m_parentContext(parentContext) { }