15个版本 (2个稳定版)
1.0.1 | 2022年10月12日 |
---|---|
1.0.0 | 2022年6月2日 |
0.7.0 | 2021年10月3日 |
0.6.1 | 2021年7月31日 |
0.4.1 | 2020年6月22日 |
#19 in 调试
72,634 每月下载量
在 69 个crate(47个直接) 中使用
195KB
4K SLoC
float_eq
比较IEEE浮点原语、结构和集合的相等性。
此crate提供了一个API,重点是使比较算法和容差的选择对实现者和维护者直观易用,并提供清晰的输出以供调试和开发迭代。
本readme是对此crate的快速介绍。有关介绍性材料、指南和讨论,请参阅 float_eq指南。
使用方法
将其添加到您的cargo.toml中
[dependencies]
float_eq = "1"
如果使用2015版,则将其添加到crate根目录
extern crate float_eq;
然后,您可以使用 use
导入项目
use float_eq::{assert_float_eq, float_eq};
比较
此crate提供布尔比较操作
if (float_eq!(y_pos, 0.0, abs <= 0.000_1)) {
//...
}
以及断言
const RECIP_REL_TOL: f32 = 0.000_366_210_94;
assert_float_eq!(x.recip(), 10.0, r2nd <= RECIP_REL_TOL);
使用基于比较算法的绝对容差、相对容差或ULPs。
复合类型
复合类型可以实施提供的扩展特性,以便逐字段比较
let a = Complex32 { re: 2.0, im: 4.000_002 };
let b = Complex32 { re: 2.000_000_5, im: 4.0 };
assert_float_eq!(a, b, ulps <= ComplexUlps32 { re: 2, im: 4 });
...如果它们是同质的,则在整个字段上应用统一容差
assert_float_eq!(a, b, ulps_all <= 4);
支持任何大小的数组
let a = [1.0, -2.0, 3.0];
let b = [-1.0, 2.0, 3.5];
assert_float_eq!(a, b, abs <= [2.0, 4.0, 0.5]);
assert_float_eq!(a, b, abs_all <= 4.0);
以及大小为12(含)的元组
let a = (1.0f32, 2.0f64);
let b = (1.5f32, -2.0f64);
assert_float_eq!(a, b, r2nd <= (0.5, 2.0));
支持许多标准类型和核心类型,如Vec
let a = vec![1.0, -2.0, 3.0];
let b = vec![-1.0, 2.0, 3.5];
assert_float_eq!(a, b, rmax <= vec![2.0, 2.0, 0.25]);
assert_float_eq!(a, b, rmax_all <= 2.0);
存在用于比较可变和不可变引用类型的泛型实现、Cell
、RefCell
、Rc
、Arc
和Box
实例的内容,以及用于切片、Option
、Vec
、VecDeque
、LinkedList
、BTreeMap
和HashMap
的实现。
可推导
扩展特质可以用于非泛型结构体和元组结构体
#[derive_float_eq(
ulps_tol = "PointUlps",
ulps_tol_derive = "Clone, Copy, Debug, PartialEq",
debug_ulps_diff = "PointUlpsDebugUlpsDiff",
debug_ulps_diff_derive = "Clone, Copy, Debug, PartialEq",
all_tol = "f64"
)]
#[derive(Debug, PartialEq, Clone, Copy)]
pub struct Point {
pub x: f64,
pub y: f64,
}
let a = Point { x: 1.0, y: -2.0 };
let c = Point {
x: 1.000_000_000_000_000_9,
y: -2.000_000_000_000_001_3
};
assert_float_eq!(a, c, ulps <= PointUlps { x: 4, y: 3 });
assert_float_eq!(a, c, ulps_all <= 4);
错误信息
断言提供了额外的有用上下文信息。例如
assert_float_eq!(4.0f32, 4.000_008, rmax <= 0.000_001);
出现此错误消息时引发恐慌
thread 'main' panicked at 'assertion failed: `float_eq!(left, right, rmax <= t)`
left: `4.0`,
right: `4.000008`,
abs_diff: `0.000008106232`,
ulps_diff: `Some(17)`,
[rmax] t: `0.000004000008`', assert_failure.rs:15:5
其中[rmax] t
显示在适当缩放后,与绝对差异进行比较的容差值。
可选功能
此crate可以在不使用标准库的情况下使用(通过禁用默认的std
功能)#![no_std]
。在Cargo.toml
中使用此功能
[dependencies.float_eq]
version = "1"
default-features = false
其他可选功能
- derive —— 为所有特质提供自定义推导宏。
- num —— 当与兼容类型实例化时,为
num::Complex
提供泛型实现。
相关努力
approx
、float-cmp
、assert_float_eq
和is_close
crate提供了与float_eq
类似的浮点数比较功能。crate almost
将API分为对零值和非零值的比较。crate efloat
提供了一个f32
等价类型,该类型跟踪可能由于舍入而产生的最大可能的误差界限。
crate ieee754
不是一个比较库,但它提供了分解浮点数到其组成部分、迭代可表示的值以及直接处理ULPs等功能。
贡献
欢迎建设性的反馈、建议和贡献,请打开一个问题。
变更日志
发布信息可在CHANGELOG.md中找到。
依赖项
~0–265KB