Line data Source code
1 1 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : /// \file 5 : /// Declares functions for solving quadratic equations 6 : 7 : #pragma once 8 : 9 : #include <array> 10 : #include <optional> 11 : 12 : /*! 13 : * \ingroup NumericalAlgorithmsGroup 14 : * \brief Returns the positive root of a quadratic equation \f$ax^2 + 15 : * bx + c = 0\f$ 16 : * \returns The positive root of a quadratic equation. 17 : * \requires That there are two real roots, of which only one is positive. 18 : */ 19 1 : double positive_root(double a, double b, double c); 20 : 21 : /*! 22 : * \ingroup NumericalAlgorithmsGroup 23 : * \brief Returns the smallest root of a quadratic equation \f$ax^2 + 24 : * bx + c = 0\f$ that is greater than the given value, within roundoff. 25 : * \returns A root of a quadratic equation. 26 : * \requires That there are two real roots. 27 : * \requires At least one root is greater than the given value, to roundoff. 28 : */ 29 : template <typename T> 30 1 : T smallest_root_greater_than_value_within_roundoff(const T& a, const T& b, 31 : const T& c, double value); 32 : /*! 33 : * \ingroup NumericalAlgorithmsGroup 34 : * \brief Returns the largest root of a quadratic equation 35 : * \f$ax^2 + bx + c = 0\f$ that is between min_value and max_value, 36 : * within roundoff. 37 : * \returns A root of a quadratic equation. 38 : * \requires That there are two real roots. 39 : * \requires At least one root is between min_value and max_value, to roundoff. 40 : */ 41 : template <typename T> 42 1 : T largest_root_between_values_within_roundoff(const T& a, const T& b, 43 : const T& c, double min_value, 44 : double max_value); 45 : /*! 46 : * \ingroup NumericalAlgorithmsGroup 47 : * \brief Returns the two real roots of a quadratic equation \f$ax^2 + 48 : * bx + c = 0\f$ with the root closer to \f$-\infty\f$ first, or an 49 : * empty optional if there are no real roots. 50 : */ 51 1 : std::optional<std::array<double, 2>> real_roots(double a, double b, double c);