#assert #float #close #approximate

close-to

提供任意精度比较的库

2 个不稳定版本

0.2.0 2024 年 5 月 12 日
0.1.0 2024 年 5 月 9 日

#232 in 调试

Download history 48/week @ 2024-05-03 246/week @ 2024-05-10 23/week @ 2024-05-17 4/week @ 2024-05-24 3/week @ 2024-05-31 3/week @ 2024-06-07 1/week @ 2024-06-14

每月下载 60
2 个 代码包中使用

MIT/Apache 许可证

14KB
126

close-to-rs

提供了一个名为 Tolerate 的函数,用于验证任意精度下浮点数的等价性。

提供用于验证任意精度下浮点数等价性的函数和特质。

还存在一个用于与 assert-be-close 兼容的别名,因此更改代码包不需要更改代码。

assert-be-close 与之兼容的别名也存在,因此更改库不需要更改代码。

使用方法(Usage)

使用任意精度比较数值。

使用任意精度比较数值。

use close_to::{close_to, far_from};

fn example() {
    let (is_close, expected_diff, received_diff) = close_to(1.0, 1.0001, 3);
    assert!(is_close);

    let (is_close, expected_diff, received_diff) = close_to(1.0, 1.0001, 4);
    assert!(is_close); // panic!


    let (is_close, expected_diff, received_diff) = far_from(1.0, 1.0001, 4);
    assert!(is_close);

    let (is_close, expected_diff, received_diff) = far_from(1.0, 1.0001, 3);
    assert!(is_close); // panic!
}

如果第一个参数 T 是浮点数,并且第二个参数 U 实现了 Into<T>,则可以比较不同类型的值。

如果第一个参数 T 是浮点数并且第二个参数 U 实现了 Into<T>,则可以比较不同类型的值。

use close_to::{close_to, far_from};

fn example() {
    close_to(1.0_f64, 1.0001_f32, 3);
    close_to(1.0001_f64, 1_u8, 3);

    close_to(1.0_f32, 1.0001_f64, 3); // the trait bound `f32: std::convert::From<f64>` is not satisfied [E0277]
}

还有一个函数,如果比较结果为假,则与调试表达式一起恐慌。

还有一个函数,如果比较结果为假,则与调试表达式一起恐慌。

use close_to::{assert_close_to, assert_far_from};

fn example() {
    assert_close_to(1.0, 1.0001, 4); // panic with the following message

    // assertion 'left ≈ right` failed
    // left:  1
    // right: 1.0001
    // received_diff: 0.00009999999999998899
    // expected_diff: 0.00005

    assert_far_from(1.0, 1.0001, 3); // panic with the following message

    // assertion 'left != right` failed
    // left:  1
    // right: 1.0001
    // received_diff: 0.00009999999999998899
    // expected_diff: 0.0005
}

还提供了特质来实现这些函数。默认情况下,它们为 f32f64 实现。 T.close_to(U, precision)close_to(T, U, precision) 有相同的行为。

我们还提供了实现这些功能的特例。默认情况下,它针对 f32f64 进行了实现。函数 T.close_to(U, precision)close_to(T, U, precision) 具有相同的行为。

use close_to::{AssertCloseTo, CloseTo};

fn example() {
    let is_close = 1_f64.close_to(1.0001, 3).0;
    assert!(is_close);

    let is_close = 1_f64.close_to(1.0001, 4).0;
    assert!(is_close); // panic!

    1_f64.assert_close_to(1.0001, 4); // panic with the same message as `assert_close_to`
    1_f64.assert_far_from(1.0001, 3); // panic with the same message as `assert_far_from`
}

许可证(License)

根据您选择的以下任一许可证

任选其一。

依赖项

约 465KB