8个稳定版本
使用旧的Rust 2015
1.1.3 | 2018年11月1日 |
---|---|
1.0.4 | 2018年10月31日 |
在 调试 中排名 234
每月下载量12,651次
在 35 个crate(24个直接)中使用
27KB
391 行
assert_float_eq
用于检查用户定义容差内的浮点数相等的断言。在 std
和 no_std
环境中均有效。
目录
入门
首先,将 assert_float_eq 添加到你的 Cargo.toml
[dependencies]
assert_float_eq = "1"
然后,在 lib.rs
中导入宏
#[macro_use]
extern crate assert_float_eq;
最后,像使用其他Rust断言一样使用断言
assert_float_absolute_eq!(3.0, 4.0, 1.0); // 4.0-3.0 <= 1.0
assert_float_relative_eq!(4.0, 3.9, 0.03); // (4.0-3.0) / 4.0 <= 0.3
assert_f32_near!(1.0e-45, 7.0e-45, 4); // exactly 4 steps away
assert_f64_near!(5.0e-324, 2.5e-323, 4); // exactly 4 steps away
当需要更柔软的错误处理时,assert_float_eq 还包括 "期望",它返回一个 Result<(), T: Display>
,表示比较是否成功
expect_float_absolute_eq!(3.0, 4.0, 1.0); // Ok(_)
expect_float_absolute_eq!(3.0, 4.0, 0.9); // Err(_)
expect_float_relative_eq!(4.0, 3.9, 0.03); // Ok(_)
expect_float_relative_eq!(4.0, 3.9, 0.02); // Err(_)
expect_f32_near!(1.0e-45, 7.0e-45, 4); // Ok(_)
expect_f32_near!(1.0e-45, 7.0e-45, 3); // Err(_)
expect_f64_near!(5.0e-324, 2.5e-323, 4); // Ok(_)
expect_f64_near!(5.0e-324, 2.5e-323, 3); // Err(_)
描述
assert_float_eq 导出4个宏,每个宏都提供了比较浮点数的不同启发式方法。
assert_float_absolute_eq
比较的是,两个浮点数之间的差的绝对值小于epsilon(默认为1e-6),即 | a - b | < epsilon
。这是一个最容易理解的宏,因为它确保两个浮点数之间的差异低于某个固定的阈值。然而,对于非常小或非常大的浮点数,绝对比较可能会导致错误的比较,因为误差容忍度不会随着浮点精度而缩放。
assert_float_relative_eq
比较浮点数之间的值,使得浮点数之间差异的相对值小于 epsilon(默认 1e-6),或者 (| a - b | / max(|a|, |b|)
< epsilon`。这是一个易于理解的宏,并且适用于大浮点数,然而,它对于小(非正常)浮点数,尤其是 0 来说会失败。例如,1e-45 和 3e-45 之间的相对误差约为 67%,尽管它们之间没有 32 位表示。
assert_f32_near
和 assert_f64_near
通过默认的步数确保两个浮点数彼此之间相差几个步骤,默认为 4。步骤比较适用于所有浮点数值,尽管最初看起来有些反直觉。一步相当于浮点数底层数字的直接增加/减少,就像它们是有符号整数一样。例如,对于 32 位浮点数,从 0.0 到 1e-6 需要 ~1e9 步,然而,对于值为 3e37 的浮点数,每一步都会使浮点数增加 ~3e30。
每个 assert_*
宏也有一个 expect_*
变体,它返回一个 Result,表示比较是否成功。
文档
assert_float_eq 的文档可以在 docs.rs 上找到。
许可证
assert_float_eq 同时受 Apache 2.0 许可证和 MIT 许可证的约束。请参阅 LICENCE-MIT 和 LICENCE-APACHE 文件了解许可证。
贡献
除非您明确说明,否则您根据 Apache-2.0 许可证定义的任何有意提交以包含在 assert_float_eq 中的贡献,将如上所述双许可,没有任何额外条款或条件。