fn approximately_equal(
a: f64,
b: f64,
epsilon: f64,
) -> bool {
(a - b).abs() <= epsilon
}
fn main() {
/*
* Classic floating-point precision example.
*/
let x: f64 = 0.1 + 0.2;
let y: f64 = 0.3;
println!("================================================");
println!(" Safe Floating-Point Comparison in Rust");
println!("================================================");
println!();
/*
* Display additional precision so the tiny
* difference becomes visible.
*/
println!("x = {:.17}", x);
println!("y = {:.17}", y);
println!();
/*
* BAD PRACTICE:
* Direct comparison using ==.
*
* This may fail because of tiny rounding errors.
*/
if x == y {
println!("Direct comparison (==): Equal");
} else {
println!("Direct comparison (==): Not Equal");
}
println!();
/*
* GOOD PRACTICE:
* Compare using approximately_equal().
*/
if approximately_equal(x, y, 1e-9) {
println!("approximately_equal(): Equal");
} else {
println!("approximately_equal(): Not Equal");
}
println!();
/*
* Additional examples.
*/
let large_a: f64 = 1_000_000.000_000_001;
let large_b: f64 = 1_000_000.000_000_002;
let near_zero_a: f64 = 1e-12;
let near_zero_b: f64 = 0.0;
println!("Additional Tests");
println!("----------------");
println!(
"Large values equal: {}",
approximately_equal(large_a, large_b, 1e-9)
);
println!(
"Near-zero values equal: {}",
approximately_equal(near_zero_a, near_zero_b, 1e-9)
);
println!(
"1.5 and 2.0 equal: {}",
approximately_equal(1.5, 2.0, 1e-9)
);
}
/*
run:
================================================
Safe Floating-Point Comparison in Rust
================================================
x = 0.30000000000000004
y = 0.29999999999999999
Direct comparison (==): Not Equal
approximately_equal(): Equal
Additional Tests
----------------
Large values equal: true
Near-zero values equal: true
1.5 and 2.0 equal: false
*/