Clippy 抱怨严格的 f32 比较
Clippy complaining on strict f32 comparison
我有一个看起来像这样的测试断言
assert_eq!(-0.000031989493, res);
适用于测试。但是当我 运行 Clippy 在我的测试中它抱怨时。
error: strict comparison of `f32` or `f64`
--> src/main.rs:351:9
|
351 | assert_eq!(-0.000031989493, res);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#float_cmp
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
我查看了提供的 link https://rust-lang.github.io/rust-clippy/master/index.html#float_cmp 并改写为这样。
assert_eq!(
true,
(res - -0.000031989493).abs() < f32::EPSILON
);
但这会降低测试的可读性,如果测试失败,我将无法在输出中看到我正在测试的结果。
我应该如何编写我的 f32 比较断言,以便 Clippy 满意并且测试在失败时仍会在终端中输出值?
或者我不应该 运行 Clippy 在我的测试中?
谢谢!
好的,我已经复制并稍微修改了 assert_eq 宏
macro_rules! assert_almost_eq {
($left:expr, $right:expr, $prec:expr) => {{
match (&$left, &$right) {
(left_val, right_val) => {
let diff = (left_val - right_val).abs();
if diff > $prec {
panic!(
"assertion failed: `(left == right)`\n left: `{:?}`,\n right: `{:?}`",
&*left_val, &*right_val
)
}
}
}
}};
}
我不是很明白一切,比如匹配的原因,但它似乎解决了我的问题。
我有一个看起来像这样的测试断言
assert_eq!(-0.000031989493, res);
适用于测试。但是当我 运行 Clippy 在我的测试中它抱怨时。
error: strict comparison of `f32` or `f64`
--> src/main.rs:351:9
|
351 | assert_eq!(-0.000031989493, res);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `f32::EPSILON` and `f64::EPSILON` are available for the `error_margin`
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#float_cmp
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
我查看了提供的 link https://rust-lang.github.io/rust-clippy/master/index.html#float_cmp 并改写为这样。
assert_eq!(
true,
(res - -0.000031989493).abs() < f32::EPSILON
);
但这会降低测试的可读性,如果测试失败,我将无法在输出中看到我正在测试的结果。
我应该如何编写我的 f32 比较断言,以便 Clippy 满意并且测试在失败时仍会在终端中输出值?
或者我不应该 运行 Clippy 在我的测试中?
谢谢!
好的,我已经复制并稍微修改了 assert_eq 宏
macro_rules! assert_almost_eq {
($left:expr, $right:expr, $prec:expr) => {{
match (&$left, &$right) {
(left_val, right_val) => {
let diff = (left_val - right_val).abs();
if diff > $prec {
panic!(
"assertion failed: `(left == right)`\n left: `{:?}`,\n right: `{:?}`",
&*left_val, &*right_val
)
}
}
}
}};
}
我不是很明白一切,比如匹配的原因,但它似乎解决了我的问题。