11个不稳定版本

使用旧的Rust 2015

0.5.1 2022年1月23日
0.5.0 2021年6月2日
0.4.0 2020年10月25日
0.3.2 2019年3月17日
0.1.0 2015年11月30日

#29 in Rust模式

Download history 279080/week @ 2024-03-14 276863/week @ 2024-03-21 278643/week @ 2024-03-28 276576/week @ 2024-04-04 283092/week @ 2024-04-11 275822/week @ 2024-04-18 277055/week @ 2024-04-25 275983/week @ 2024-05-02 276086/week @ 2024-05-09 295118/week @ 2024-05-16 289763/week @ 2024-05-23 303563/week @ 2024-05-30 299870/week @ 2024-06-06 301484/week @ 2024-06-13 307558/week @ 2024-06-20 239692/week @ 2024-06-27

1,206,433 每月下载量
用于 4,763 个crate (748 个直接使用)

Apache-2.0

38KB
689

approx

Build Status Version Documentation Downloads License

为Rust编程语言提供近似浮点等价比较和断言的库。


lib.rs:

一个提供测试基于浮点类型近似等价的便利的crate,使用相对差异或最后一位(ULP)比较。

您还可以使用 *_{eq, ne}!assert_*_{eq, ne}! 宏来使用更定位的样式进行等价测试

#[macro_use]
extern crate approx;

use std::f64;

abs_diff_eq!(1.0, 1.0);
abs_diff_eq!(1.0, 1.0, epsilon = f64::EPSILON);

relative_eq!(1.0, 1.0);
relative_eq!(1.0, 1.0, epsilon = f64::EPSILON);
relative_eq!(1.0, 1.0, max_relative = 1.0);
relative_eq!(1.0, 1.0, epsilon = f64::EPSILON, max_relative = 1.0);
relative_eq!(1.0, 1.0, max_relative = 1.0, epsilon = f64::EPSILON);

ulps_eq!(1.0, 1.0);
ulps_eq!(1.0, 1.0, epsilon = f64::EPSILON);
ulps_eq!(1.0, 1.0, max_ulps = 4);
ulps_eq!(1.0, 1.0, epsilon = f64::EPSILON, max_ulps = 4);
ulps_eq!(1.0, 1.0, max_ulps = 4, epsilon = f64::EPSILON);

实现自定义类型的近似等价

*Eq 特性允许在类型上实现近似等价,基于基本的浮点实现。

例如,我们可能希望能够对复数类型进行近似断言

#[macro_use]
extern crate approx;

#[derive(Debug, PartialEq)]
struct Complex<T> {
    x: T,
    i: T,
}

let x = Complex { x: 1.2, i: 2.3 };

assert_relative_eq!(x, x);
assert_ulps_eq!(x, x, max_ulps = 4);

为此,我们可以泛型地实现 AbsDiffEqRelativeEqUlpsEq,分别以实现 AbsDiffEqRelativeEqUlpsEq 的类型参数。这意味着我们可以对 Complex<f32>Complex<f64> 进行比较

#
impl<T: AbsDiffEq> AbsDiffEq for Complex<T> where
    T::Epsilon: Copy,
{
    type Epsilon = T::Epsilon;

    fn default_epsilon() -> T::Epsilon {
        T::default_epsilon()
    }

    fn abs_diff_eq(&self, other: &Self, epsilon: T::Epsilon) -> bool {
        T::abs_diff_eq(&self.x, &other.x, epsilon) &&
        T::abs_diff_eq(&self.i, &other.i, epsilon)
    }
}

impl<T: RelativeEq> RelativeEq for Complex<T> where
    T::Epsilon: Copy,
{
    fn default_max_relative() -> T::Epsilon {
        T::default_max_relative()
    }

    fn relative_eq(&self, other: &Self, epsilon: T::Epsilon, max_relative: T::Epsilon) -> bool {
        T::relative_eq(&self.x, &other.x, epsilon, max_relative) &&
        T::relative_eq(&self.i, &other.i, epsilon, max_relative)
    }
}

impl<T: UlpsEq> UlpsEq for Complex<T> where
    T::Epsilon: Copy,
{
    fn default_max_ulps() -> u32 {
        T::default_max_ulps()
    }

    fn ulps_eq(&self, other: &Self, epsilon: T::Epsilon, max_ulps: u32) -> bool {
        T::ulps_eq(&self.x, &other.x, epsilon, max_ulps) &&
        T::ulps_eq(&self.i, &other.i, epsilon, max_ulps)
    }
}

参考文献

浮点数很复杂!感谢以下链接帮助使事情变得 稍微 容易理解

依赖项

~185KB