是否有一种首选的方法来在Rust中使用两个浮点数和一个增量进行断言?
例如...
let a = 3.0;
let b = 2.9999999999;
assert_eq!(a, b, 0.0001); // Imaginary syntax where a ~= b, within 0.0001
没有目前,您必须自己检查差异或使用float-cmp crate。
也请检查std::f32
constants。
没有内置的std::f32
,但您可以创建自己的macro。>
以下是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
(即“ delta”或“ epsilon”值,即公差)。
使用它。您可能要实现一个更强大的宏,例如检查“相对错误”的代码。这是一个不好的方法,因为当比较的数字也非常小时,选择固定的epsilon可能因为它看起来“小”而实际上可能太大。对于完全不同的数字,比较将返回“ true”。并且当数字很大时,ε可能最终小于最小的舍入误差,因此比较总是返回“ false”。
鉴于先前的实现在各种情况下都会中断,通常,您应该not
[还有一个完整的板条箱d
解决了这个难题,比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
条板箱可让您执行以下操作: