a067cd24ac
Using `f32::EPSILON` or `f64::EPSILON` as the floating-point equality comparison error margin is incorrect, yet `float_cmp` has until now recommended this be done. This change fixes the given guidance (both in docs and compiler hints) to not reference these unsuitable constants. Instead, the guidance now clarifies that the scenarios in which an absolute error margin is usable, provides a reference implementation of using a user-defined absolute error margin (as an absolute error margin can only be used-defined and may be different for different comparisons) and references the floating point guide for a reference implementation of relative error based equaltiy comparison for when absolute error margin cannot be used. changelog: Fix guidance of [`float_cmp`] and [`float_cmp_const`] to not incorrectly recommend `f64::EPSILON` as the error margin. Fixes #6816
67 lines
1.9 KiB
Rust
67 lines
1.9 KiB
Rust
// does not test any rustfixable lints
|
|
//@no-rustfix
|
|
#![warn(clippy::float_cmp_const)]
|
|
#![allow(clippy::float_cmp)]
|
|
#![allow(unused, clippy::no_effect, clippy::unnecessary_operation)]
|
|
|
|
const ONE: f32 = 1.0;
|
|
const TWO: f32 = 2.0;
|
|
|
|
fn eq_one(x: f32) -> bool {
|
|
if x.is_nan() { false } else { x == ONE } // no error, inside "eq" fn
|
|
}
|
|
|
|
fn main() {
|
|
// has errors
|
|
1f32 == ONE;
|
|
//~^ ERROR: strict comparison of `f32` or `f64` constant
|
|
TWO == ONE;
|
|
//~^ ERROR: strict comparison of `f32` or `f64` constant
|
|
TWO != ONE;
|
|
//~^ ERROR: strict comparison of `f32` or `f64` constant
|
|
ONE + ONE == TWO;
|
|
//~^ ERROR: strict comparison of `f32` or `f64` constant
|
|
let x = 1;
|
|
x as f32 == ONE;
|
|
//~^ ERROR: strict comparison of `f32` or `f64` constant
|
|
|
|
let v = 0.9;
|
|
v == ONE;
|
|
//~^ ERROR: strict comparison of `f32` or `f64` constant
|
|
v != ONE;
|
|
//~^ ERROR: strict comparison of `f32` or `f64` constant
|
|
|
|
// no errors, lower than or greater than comparisons
|
|
v < ONE;
|
|
v > ONE;
|
|
v <= ONE;
|
|
v >= ONE;
|
|
|
|
// no errors, zero and infinity values
|
|
ONE != 0f32;
|
|
TWO == 0f32;
|
|
ONE != f32::INFINITY;
|
|
ONE == f32::NEG_INFINITY;
|
|
|
|
// no errors, but will warn clippy::float_cmp if '#![allow(float_cmp)]' above is removed
|
|
let w = 1.1;
|
|
v == w;
|
|
v != w;
|
|
v == 1.0;
|
|
v != 1.0;
|
|
|
|
const ZERO_ARRAY: [f32; 3] = [0.0, 0.0, 0.0];
|
|
const ZERO_INF_ARRAY: [f32; 3] = [0.0, f32::INFINITY, f32::NEG_INFINITY];
|
|
const NON_ZERO_ARRAY: [f32; 3] = [0.0, 0.1, 0.2];
|
|
const NON_ZERO_ARRAY2: [f32; 3] = [0.2, 0.1, 0.0];
|
|
|
|
// no errors, zero and infinity values
|
|
NON_ZERO_ARRAY[0] == NON_ZERO_ARRAY2[1]; // lhs is 0.0
|
|
ZERO_ARRAY == NON_ZERO_ARRAY; // lhs is all zeros
|
|
ZERO_INF_ARRAY == NON_ZERO_ARRAY; // lhs is all zeros or infinities
|
|
|
|
// has errors
|
|
NON_ZERO_ARRAY == NON_ZERO_ARRAY2;
|
|
//~^ ERROR: strict comparison of `f32` or `f64` constant arrays
|
|
}
|