#浮点数 #等价 #数字 #确定 #容忍度 #浮点 #错误

nightly aprox_eq

一个简单的 crate,用于确定浮点类型之间的近似等价性,并将此能力派生到由浮点数和其他实现 AproxEq 的结构体。

10 个稳定版本

2.0.1 2024 年 4 月 19 日
1.6.2 2023 年 9 月 26 日
1.6.1 2023 年 7 月 19 日
1.5.0 2023 年 5 月 18 日
0.1.0 2023 年 5 月 8 日

#886Rust 模式

Download history 248/week @ 2024-04-14 30/week @ 2024-04-21 1/week @ 2024-04-28 7/week @ 2024-05-19 1/week @ 2024-05-26 98/week @ 2024-07-07

98 每月下载量

MIT 许可证

21KB
382 代码行

aprox_eq

Crate 用于确定近似等价性,尤其是在浮点数之间。这个库主要是一个快速导入和可派生的方法,用于减轻浮点误差。由于浮点数的工作方式,当量级增加时,会丢失准确的数字位数,而当量级降低时,会获得它们,因此简单的容忍度是不理想的。相反,aprox_eq 使用对浮点数标准背后的理解,并根据比较的浮点数的量级的浮点数标准的精度进行近似。这意味着查看尾数的位,即浮点数的分数部分,并将它们与一定范围的整数值进行比较,同时考虑浮点数的指数和符号的等价性。

TL;DR:随着你的浮点数越来越精确,aprox_eq 也越来越精确。

use aprox_eq::{assert_aprox_eq, assert_aprox_ne, AproxEq};

// You can derive the `AproxEq` trait the same way you can with `Eq` or `PartialEq`!

#[derive(AproxEq, Debug)]
struct MyStruct {
    a: f32,
    b: f64,
}

fn main() {
    let x = MyStruct {
        a: 3.2f32,
        b: 4.8f64,
    };

    let y = MyStruct {
        a: 3.2f32 - 1e-8,
        b: 4.8f64 - 1e-14,
    };

    assert_aprox_eq!(x, y);

    // Some normal size numbers
    assert_aprox_eq!(1.0002_f64, 1.0001999999999999_f64);
    assert_aprox_ne!(1.002_f64, 1.001_f64);

    // Tiny numbers, `aprox_eq` now requires that the numbers are closer to
    // eachother, since the float type can now store a higher precision
    assert_aprox_eq!(0.000_000_001_f64, 0.000_000_001_000_000_000_000_001_f64);
    assert_aprox_ne!(0.000_000_001_f64, 0.000_000_001_000_000_000_000_008_f64);

    // Large numbers, `aprox_eq` will now allow the numbers to be a greater
    // difference in value, since the float type has lost some precision
    assert_aprox_eq!(1_000_000_000_f32, 1_000_000_010_f32);
    assert_aprox_ne!(1_000_000_000_f32, 1_000_000_100_f32);
}

依赖项

~255–700KB
~17K SLoC