From 441207f5e4c24c05e79da9ae0533c41cd422f8bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Wed, 31 Jan 2018 16:34:52 +0100 Subject: [PATCH] [apps] Graph: for all calculations -intersection, extremum and roots-, rather display 0 than 1E-14 --- apps/graph/cartesian_function.cpp | 13 ++++++++++--- apps/graph/cartesian_function.h | 1 + 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/apps/graph/cartesian_function.cpp b/apps/graph/cartesian_function.cpp index 8b9ea116f..1b86d64be 100644 --- a/apps/graph/cartesian_function.cpp +++ b/apps/graph/cartesian_function.cpp @@ -64,7 +64,11 @@ CartesianFunction::Point CartesianFunction::nextIntersectionFrom(double start, d double resultAbscissa = nextIntersectionWithFunction(start, step, max, [](double x, Context * context, const Shared::Function * function0, const Shared::Function * function1) { return function0->evaluateAtAbscissa(x, context)-function1->evaluateAtAbscissa(x, context); }, context, function); - return {.abscissa = resultAbscissa, .value = evaluateAtAbscissa(resultAbscissa, context)}; + CartesianFunction::Point result = {.abscissa = resultAbscissa, .value = evaluateAtAbscissa(resultAbscissa, context)}; + if (std::fabs(result.value) < step*k_precision) { + result.value = 0.0; + } + return result; } CartesianFunction::Point CartesianFunction::nextMinimumOfFunction(double start, double step, double max, Evaluation evaluate, Context * context, const Shared::Function * function, bool lookForRootMinimum) const { @@ -82,10 +86,13 @@ CartesianFunction::Point CartesianFunction::nextMinimumOfFunction(double start, } } while (endCondition); - if (std::fabs(result.abscissa) < 1E2*k_sqrtEps) { + if (std::fabs(result.abscissa) < step*k_precision) { result.abscissa = 0; result.value = evaluate(0, context, this, function); } + if (std::fabs(result.value) < step*k_precision) { + result.value = 0; + } if (lookForRootMinimum) { result.abscissa = std::fabs(result.value) >= k_sqrtEps ? NAN : result.abscissa; } @@ -247,7 +254,7 @@ double CartesianFunction::nextIntersectionWithFunction(double start, double step result = resultExtremum[i].abscissa; } } - if (std::fabs(result) < step/1E3) { + if (std::fabs(result) < step*k_precision) { result = 0; } return result; diff --git a/apps/graph/cartesian_function.h b/apps/graph/cartesian_function.h index a68c93ff6..0b4bb4393 100644 --- a/apps/graph/cartesian_function.h +++ b/apps/graph/cartesian_function.h @@ -23,6 +23,7 @@ public: Point nextIntersectionFrom(double start, double step, double max, Poincare::Context * context, const Shared::Function * function) const; char symbol() const override; private: + constexpr static double k_precision = 1.0E-5; constexpr static double k_sqrtEps = 1.4901161193847656E-8; // sqrt(DBL_EPSILON) constexpr static double k_goldenRatio = 0.381966011250105151795413165634361882279690820194237137864; // (3-sqrt(5))/2 typedef double (*Evaluation)(double abscissa, Poincare::Context * context, const Shared::Function * function0, const Shared::Function * function1);