Robust C++ quadratic equation solver. Solves quadratics equations without undue overflow, underflow, or catastrophic floating point cancellation.
Based on The Ins and Outs of Solving Quadratic Equations with Floating-Point Arithmetic (2023) by Frédéric Goualard (@goualard-f).
Original Julia implementation at https://github.com/goualard-f/QuadraticEquation.jl.
Download the header file Then, simply #include "quadratic.h"
and compile using your preferred build system.
To solve a quadratic equation with parameters a
, b
, and c
, call the solve
function in the quadratic
namespace.This function returns a std::pair<T, T>
, where T
is the input type. T
can be any floating point type.
float a = 1.0f;
float b = 0.0f;
float c = -1.0f;
auto [x1, x2] = quadratic::solve(a, b, c); // [-1, 1]
If there are no real solutions, then the pair will contain two NaNs.
long double a = 1.0;
long double b = 0.0;
long double c = 1.0;
auto [x1, x2] = quadratic::solve(a, b, c); // [nan, nan]
If there is only one solution, it will be contained in the first element of the returned pair, while the second element of the pair will be a NaN.
double a = 1.0;
double b = 2.0;
double c = 1.0;
auto [x1, x2] = quadratic::solve(a, b, c); // [-1, nan]
When the equation has two solutions, the first solution will be the smaller of the two, i.e. x1 < x2
.
double a = 1.0;
double b = -1.0;
double c = 6.0;
auto [x1, x2] = quadratic::solve(a, b, c) // [-2, 3]
While I have done my best to optimize this library, in my tests, this is typically about 2.4-2.7 times slower than a naive quadratic solver. I think more optimizations are certainly possible, and I welcome performance enhancement suggestions or PRs.