是否有一种首选方法可以在Rust中使用两个浮点数和一个delta进行断言?
例如......
let a = 3.0;
let b = 2.9999999999;
assert_eq!(a, b, 0.0001); // Imaginary syntax where a ~= b, within 0.0001
答案 0 :(得分:5)
没有。目前,您必须自己检查差异或使用float-cmp crate。
另请查看std::f32
constants。
答案 1 :(得分:5)
没有内置的macro,但您可以创建自己的。{/ p>
以下是this article中描述的“绝对错误”版本的实现。
macro_rules! assert_delta {
($x:expr, $y:expr, $d:expr) => {
if !($x - $y < $d || $y - $x < $d) { panic!(); }
},
}
具体来说,如果assert_delta
和x
以及y
和y
之间的差异大于或等于x
,则广告d
会发生恐慌(“delta”或“epsilon”值,即容差)。
这是一种不好的方法,因为当被比较的数字非常小时,因为它“看起来很小”而选择的固定epsil实际上可能太大了。对于完全不同的数字,比较将返回“true”。当数字非常大时,epsilon可能最终小于最小的舍入误差,因此比较总是返回“false”。
鉴于以前的实现在各种情况下都会中断,一般来说,您应该不使用它。您可能希望实现更强大的宏,例如检查“相对错误”的那个。
答案 2 :(得分:3)
还有approx条板箱,可让您执行以下操作:
relative_eq!(1.0, 1.0, epsilon = f64::EPSILON);
relative_eq!(1.0, 1.0, max_relative = 1.0);
relative_eq!(1.0, 1.0, epsilon = f64::EPSILON, max_relative = 1.0);
答案 3 :(得分:0)
还有一个完整的板条箱assert_approx_eq解决了这一难题,比float-cmp好。
use assert_approx_eq::assert_approx_eq;
let a = 3f64;
let b = 4f64;
assert_approx_eq!(a, b); // panics
assert_approx_eq!(a, b, 2f64); //does not panic
assert_approx_eq!(a, b, 1e-3f64); // panics