ASSERT_EQ!浮点数和delta

时间:2015-06-15 22:54:17

标签: unit-testing rust

是否有一种首选方法可以在Rust中使用两个浮点数和一个delta进行断言?

例如......

let a = 3.0;
let b = 2.9999999999;
assert_eq!(a, b, 0.0001); // Imaginary syntax where a ~= b, within 0.0001

4 个答案:

答案 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_deltax以及yy之间的差异大于或等于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