assert_eq!带有浮点数和增量

问题描述 投票:12回答:4

是否有一种首选的方法来在Rust中使用两个浮点数和一个增量进行断言?

例如...

let a = 3.0;
let b = 2.9999999999;
assert_eq!(a, b, 0.0001); // Imaginary syntax where a ~= b, within 0.0001
unit-testing rust
4个回答
6
投票

没有目前,您必须自己检查差异或使用float-cmp crate

也请检查std::f32 constants


5
投票

没有内置的std::f32,但您可以创建自己的macro。>

以下是this article中描述的“绝对错误”版本的实现。

macro_rules! assert_delta {
    ($x:expr, $y:expr, $d:expr) => {
        if !($x - $y < $d || $y - $x < $d) { panic!(); }
    },
}

特别是,如果assert_deltaxyy之间的差都大于或等于x(即“ delta”或“ epsilon”值,即公差)。

这是一个不好的方法,因为当比较的数字也非常小时,选择固定的epsilon可能因为它看起来“小”而实际上可能太大。对于完全不同的数字,比较将返回“ true”。并且当数字很大时,ε可能最终小于最小的舍入误差,因此比较总是返回“ false”。

鉴于先前的实现在各种情况下都会中断,通常,您应该not

使用它。您可能要实现一个更强大的宏,例如检查“相对错误”的代码。

1
投票

[还有一个完整的板条箱d解决了这个难题,比float-cmp好。


0
投票

还有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 条板箱可让您执行以下操作:

© www.soinside.com 2019 - 2024. All rights reserved.