use std::cmp::Ordering;
use crate::{PolyError, Result};
pub(crate) fn solve_real_linear(a: f64, b: f64) -> Result<f64> {
match a {
0.0 => Err(PolyError::ConstantPoly),
_ => Ok(-b / a),
}
}
pub(crate) fn solve_real_quadratic(a: f64, b: f64, c: f64) -> Result<Vec<f64>> {
if a == 0.0 {
return Ok(vec![solve_real_linear(b, c)?]);
}
let det = b.powi(2) - 4.0 * a * c;
let ordering = match det.partial_cmp(&0.0) {
Some(det) => det,
None => unreachable!("NaN discriminant"),
};
match ordering {
Ordering::Less => Err(PolyError::NoRealRoots),
Ordering::Equal => {
let x = -b / (2.0 * a);
Ok(vec![x])
}
Ordering::Greater => {
let x1 = (-b + det.sqrt()) / (2.0 * a);
let x2 = (-b - det.sqrt()) / (2.0 * a);
Ok(vec![x1, x2])
}
}
}