Back to Mathematical functions
#ifndef PASTELSYS_QUADRATIC_HPP
#define PASTELSYS_QUADRATIC_HPP
#include "pastel/sys/math/quadratic.h"
#include <algorithm>
#include <cmath>
namespace Pastel
{
    template <typename Real>
    bool quadratic(
        const NoDeduction<Real>& aCoeff,
        const NoDeduction<Real>& bCoeff,
        const NoDeduction<Real>& cCoeff,
        Real &t0, Real &t1,
        bool solutionsMustExist)
    {
        Real discriminant =
            bCoeff * bCoeff - 4 * aCoeff * cCoeff;
        if (discriminant < 0)
        {
            if (solutionsMustExist)
            {
                discriminant = 0;
            }
            else
            {
                return false;
            }
        }
        Real rootDiscriminant =
            std::sqrt(discriminant);
        // This is a numerically stable way to solve
        // the quadratic equation. The standard formula
        // risks for catastrophic cancellation.
        Real q = bCoeff;
        if (bCoeff < 0)
        {
            q -= rootDiscriminant;
        }
        else
        {
            q += rootDiscriminant;
        }
        q *= (Real)-0.5;
        t0 = q / aCoeff;
        t1 = cCoeff / q;
        // t0 = (-bCoeff - rootDiscriminant) / (2 * aCoeff);
        // t1 = (-bCoeff + rootDiscriminant) / (2 * aCoeff);
        // Order the solutions such that t0 <= t1.
        if (t1 < t0)
        {
            std::swap(t0, t1);
        }
        return true;
    }
}
#endif