#[inline]
pub fn lerp(a: f64, b: f64, t: f64) -> f64 {
a + (b - a) * t
}
#[inline]
pub fn lerp_ratio(a: f64, b: f64, num: f64, den: f64) -> f64 {
a + (b - a) * num / den
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn lerp_matches_explicit_recipe_bits() {
let (a, b, t) = (1.25_f64, -3.5_f64, 0.3_f64);
assert_eq!(lerp(a, b, t).to_bits(), (a + (b - a) * t).to_bits());
}
#[test]
fn lerp_endpoints_are_exact() {
assert_eq!(lerp(2.0, 5.0, 0.0).to_bits(), 2.0_f64.to_bits());
assert_eq!(lerp(2.0, 5.0, 1.0).to_bits(), 5.0_f64.to_bits());
}
#[test]
fn lerp_ratio_matches_explicit_recipe_bits() {
let (a, b, num, den) = (1.0e-6_f64, 1.3e-6_f64, 7.0_f64, 30.0_f64);
assert_eq!(
lerp_ratio(a, b, num, den).to_bits(),
(a + (b - a) * num / den).to_bits()
);
}
#[test]
fn lerp_ratio_preserves_multiply_before_divide_order() {
let (a, b, num, den) = (0.0_f64, 1.0_f64, 1.0_f64, 3.0_f64);
assert_eq!(
lerp_ratio(a, b, num, den).to_bits(),
(a + (b - a) * num / den).to_bits()
);
}
}