#comparison #equality #float #assert #approximate

no-std float_eq

比较IEEE浮点原语、结构和集合的相等性

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 调试

Download history 16194/week @ 2024-03-14 16339/week @ 2024-03-21 15053/week @ 2024-03-28 15053/week @ 2024-04-04 16203/week @ 2024-04-11 16977/week @ 2024-04-18 16759/week @ 2024-04-25 14412/week @ 2024-05-02 19409/week @ 2024-05-09 16296/week @ 2024-05-16 15891/week @ 2024-05-23 16842/week @ 2024-05-30 18738/week @ 2024-06-06 18297/week @ 2024-06-13 18855/week @ 2024-06-20 13199/week @ 2024-06-27

72,634 每月下载量
69 个crate(47个直接) 中使用

MIT/Apache

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);

存在用于比较可变和不可变引用类型的泛型实现、CellRefCellRcArcBox实例的内容,以及用于切片、OptionVecVecDequeLinkedListBTreeMapHashMap的实现。

可推导

扩展特质可以用于非泛型结构体和元组结构体

#[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提供泛型实现。

approxfloat-cmpassert_float_eqis_closecrate提供了与float_eq类似的浮点数比较功能。crate almost将API分为对零值和非零值的比较。crate efloat提供了一个f32等价类型,该类型跟踪可能由于舍入而产生的最大可能的误差界限。

crate ieee754不是一个比较库,但它提供了分解浮点数到其组成部分、迭代可表示的值以及直接处理ULPs等功能。

贡献

欢迎建设性的反馈、建议和贡献,请打开一个问题

变更日志

发布信息可在CHANGELOG.md中找到。

依赖项

~0–265KB