Clippy lints / Suspicious
Clippy lint · Suspicious · checked with Clippy 0.1.99
clippy::float_equality_without_abs: float equality check without `.abs()`
What it meansChecks for statements of the form (a - b) < f32::EPSILON or (a - b) < f64::EPSILON. Note the missing .abs(). It is in the suspicious group and warns by default.
What you see
warning: float equality check without `.abs()` --> main.rs:4:5 | 4 | (a - b) < f32::EPSILON | -------^^^^^^^^^^^^^^^ | | | help: add `.abs()`: `(a - b).abs()` | = help: for further information visit https://rust-lang.github.io/rust-clippy/stable/index.html#float_equality_without_abs = note: `#[warn(clippy::float_equality_without_abs)]` on by default
Real output of Clippy 0.1.99 (Rust 1.99) on the example below. Names and line numbers in yours will differ.
Does it matter?
The code without .abs() is more likely to have a bug.
Code that is most likely wrong or useless. Warns by default.
How to fix it
Clippy does not fix this one automatically (its suggestion may change behaviour, so it only shows it). Change the code by hand:
Flagged
pub fn is_roughly_equal(a: f32, b: f32) -> bool {
(a - b) < f32::EPSILON
}
Write this instead
pub fn is_roughly_equal(a: f32, b: f32) -> bool {
(a - b).abs() < f32::EPSILON
}
Turn it off, or on
Allow it where it does not fit your code, as narrowly as you can:
On one item
#[allow(clippy::float_equality_without_abs)]
fn my_function() { /* ... */ }Whole crate (Cargo.toml)
[lints.clippy]
float_equality_without_abs = "allow"One run
cargo clippy -- -A clippy::float-equality-without-absThe [lints] table needs Rust 1.74 or newer. In a workspace, put it under [workspace.lints.clippy] and add [lints] workspace = true to each member.
Clippy's own documentation
What it does
Checks for statements of the form (a - b) < f32::EPSILON or
(a - b) < f64::EPSILON. Note the missing .abs().
Why is this bad?
The code without .abs() is more likely to have a bug.
Known problems
If the user can ensure that b is larger than a, the .abs() is
technically unnecessary. However, it will make the code more robust and doesn’t have any
large performance implications. If the abs call was deliberately left out for performance
reasons, it is probably better to state this explicitly in the code, which then can be done
with an allow.
Example
pub fn is_roughly_equal(a: f32, b: f32) -> bool {
(a - b) < f32::EPSILON
}
Use instead:
pub fn is_roughly_equal(a: f32, b: f32) -> bool {
(a - b).abs() < f32::EPSILON
}
From the Clippy lint list (0.1.99), part of the Rust project, MIT or Apache-2.0. Official entry.
Related lints
- empty_line_after_doc_commentsempty line after doc comment
- empty_line_after_outer_attrempty line after outer attribute
- empty_loopempty `loop {}` wastes CPU cycles
- for_unbounded_rangefor loop on unbounded range
- forget_non_dropcall to `std::mem::forget` with a value that does not implement `Drop`. Forgetting such a type is the same as dropping it
- four_forward_slashesthis item has comments with 4 forward slashes (`////`). These look like doc comments, but they aren't
All 847 Clippy lints · Rust compiler errors · Cargo.toml checker
Up next
Related lintclippy::empty_line_after_doc_commentsempty line after doc commentRead it next →Did this answer your question?