#approximate #equals #float

no-std isclose

用于比较近似相等性的 trait 和宏的集合

2 个版本

0.1.1 2024 年 5 月 11 日
0.1.0 2024 年 5 月 2 日

#570 in Rust 模式

Download history 95/week @ 2024-04-26 69/week @ 2024-05-03 166/week @ 2024-05-10 31/week @ 2024-05-17 3/week @ 2024-05-24 4/week @ 2024-05-31 25/week @ 2024-06-07 8/week @ 2024-06-14 2/week @ 2024-06-28 8/week @ 2024-07-05

71 每月下载量

MIT/Apache

47KB
1K SLoC

isclose — 测试状态Crate 版本Rust 版本

此 crate 提供了一组用于比较任意类型的 trait 和宏。

默认情况下,trait IsClosef32f64 实现。

以下特性还隐藏了额外的实现

  • halfhalff16bf16 实现 IsClose
  • euclideuclid 的几何类型实现 IsClose

用法

use isclose::{IsClose, assert_is_close};

// This will fail!
// assert_eq!(0.1 + 0.2, 0.3)

// This will pass
assert!((0.1 + 0.2).is_close(0.3));

// Equivalent, but gives better error messages
assert_is_close!(0.1 + 0.2, 0.3);

您还可以为自定义类型实现 IsClose

use isclose::{IsClose, assert_is_close};
use std::borrow::Borrow;

#[derive(Debug)]
struct Vector { x: f32, y: f32 }

impl IsClose<f32> for Vector {
    // Use the same default tolerances as f32
    // You can override the defaults here if necessary
    const ABS_TOL: f32 = <f32 as IsClose>::ABS_TOL;
    const REL_TOL: f32 = <f32 as IsClose>::REL_TOL;

    fn is_close_tol(
        &self,
        other: impl Borrow<Self>,
        rel_tol: impl Borrow<f32>,
        abs_tol: impl Borrow<f32>,
    ) -> bool {
        let (other, rel_tol, abs_tol) = (other.borrow(), rel_tol.borrow(), abs_tol.borrow());
        self.x.is_close_tol(other.x, rel_tol, abs_tol) &&
            self.y.is_close_tol(other.y, rel_tol, abs_tol)
    }
}

assert_is_close!(
    Vector {
        x: 0.1 + 0.2,
        y: 0.2 + 0.4,
    },
    Vector {
        x: 0.3,
        y: 0.6,
    }
)

许可协议

根据您的选择,许可协议为以下之一

除非您明确声明,否则任何您有意提交以包含在此 crate 中的贡献,根据 Apache-2.0 许可协议定义,均应按上述方式双重许可,不附加任何额外条款或条件。

依赖项

~0–310KB