28 lines
No EOL
843 B
Text
28 lines
No EOL
843 B
Text
### What it does
|
|
Checks for (in-)equality comparisons on floating-point
|
|
values (apart from zero), except in functions called `*eq*` (which probably
|
|
implement equality for a type involving floats).
|
|
|
|
### Why is this bad?
|
|
Floating point calculations are usually imprecise, so
|
|
asking if two values are *exactly* equal is asking for trouble. For a good
|
|
guide on what to do, see [the floating point
|
|
guide](http://www.floating-point-gui.de/errors/comparison).
|
|
|
|
### Example
|
|
```
|
|
let x = 1.2331f64;
|
|
let y = 1.2332f64;
|
|
|
|
if y == 1.23f64 { }
|
|
if y != x {} // where both are floats
|
|
```
|
|
|
|
Use instead:
|
|
```
|
|
let error_margin = f64::EPSILON; // Use an epsilon for comparison
|
|
// Or, if Rust <= 1.42, use `std::f64::EPSILON` constant instead.
|
|
// let error_margin = std::f64::EPSILON;
|
|
if (y - 1.23f64).abs() < error_margin { }
|
|
if (y - x).abs() > error_margin { }
|
|
``` |