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模式
1,206,433 每月下载量
用于 4,763 个crate (748 个直接使用)
38KB
689 行
approx
为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);
为此,我们可以泛型地实现 AbsDiffEq
,RelativeEq
和 UlpsEq
,分别以实现 AbsDiffEq
,RelativeEq
和 UlpsEq
的类型参数。这意味着我们可以对 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