From 1b169e08368e5df380fbc262fcc480b562816b89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9a=20Saviot?= Date: Wed, 4 Sep 2019 17:33:04 +0200 Subject: [PATCH] [apps/solver] Fix bad assertion --- apps/probability/distribution/distribution.cpp | 4 +++- poincare/include/poincare/solver.h | 2 +- poincare/src/solver.cpp | 15 +++++++-------- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/apps/probability/distribution/distribution.cpp b/apps/probability/distribution/distribution.cpp index 2f75c5028..552d0c731 100644 --- a/apps/probability/distribution/distribution.cpp +++ b/apps/probability/distribution/distribution.cpp @@ -128,7 +128,9 @@ double Distribution::cumulativeDistributiveInverseForProbabilityUsingIncreasingF this, probability, nullptr); - assert(std::isnan(result.x2()) || std::fabs(result.x2()) < valuePrecision); + /* Either no result was found, the precision is ok or the result was outside + * the given ax bx bounds */ + assert(std::isnan(result.x2()) || std::fabs(result.x2()) < valuePrecision || result.x1() == ax); return result.x1(); } diff --git a/poincare/include/poincare/solver.h b/poincare/include/poincare/solver.h index 2d18b9f60..776c28654 100644 --- a/poincare/include/poincare/solver.h +++ b/poincare/include/poincare/solver.h @@ -15,7 +15,7 @@ public: // Root static double BrentRoot(double ax, double bx, double precision, ValueAtAbscissa evaluation, Context * context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, const void * context1 = nullptr, const void * context2 = nullptr, const void * context3 = nullptr); - static Coordinate2D IncreasingFunctionRoot(double ax, double bx, double resultPrecision, double valuePrecision, ValueAtAbscissa evaluation, Context * context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, const void * context1 = nullptr, const void * context2 = nullptr, const void * context3 = nullptr); + static Coordinate2D IncreasingFunctionRoot(double ax, double bx, double resultPrecision, double valuePrecision, ValueAtAbscissa evaluation, Context * context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, const void * context1 = nullptr, const void * context2 = nullptr, const void * context3 = nullptr, double * resultEvaluation = nullptr); // Proba diff --git a/poincare/src/solver.cpp b/poincare/src/solver.cpp index 05fcda1a1..0f8fd50a7 100644 --- a/poincare/src/solver.cpp +++ b/poincare/src/solver.cpp @@ -174,19 +174,18 @@ double Solver::BrentRoot(double ax, double bx, double precision, ValueAtAbscissa return NAN; } -Coordinate2D Solver::IncreasingFunctionRoot(double ax, double bx, double resultPrecision, double valuePrecision, ValueAtAbscissa evaluation, Context * context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, const void * context1, const void * context2, const void * context3) { +Coordinate2D Solver::IncreasingFunctionRoot(double ax, double bx, double resultPrecision, double valuePrecision, ValueAtAbscissa evaluation, Context * context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, const void * context1, const void * context2, const void * context3, double * resultEvaluation) { assert(ax < bx); double min = ax; double max = bx; double currentAbscissa = min; double eval = evaluation(currentAbscissa, context, complexFormat, angleUnit, context1, context2, context3); if (eval >= 0) { - if (eval <= DBL_EPSILON) { - // The value on the left bracket is 0, return it. - return Coordinate2D(currentAbscissa, eval); + if (resultEvaluation != nullptr) { + *resultEvaluation = eval; } // The minimal value is already bigger than 0, return NAN. - return Coordinate2D(NAN, NAN); + return Coordinate2D(currentAbscissa, eval); } while (max - min > resultPrecision) { currentAbscissa = (min + max) / 2.0; @@ -199,10 +198,10 @@ Coordinate2D Solver::IncreasingFunctionRoot(double ax, double bx, double break; } } - if (std::fabs(eval) < valuePrecision) { - return Coordinate2D(currentAbscissa, eval); + if (resultEvaluation != nullptr) { + *resultEvaluation = eval; } - return Coordinate2D(NAN, NAN); + return Coordinate2D(currentAbscissa, eval); } template