3 个版本 (破坏性)

0.2.0 2019 年 8 月 11 日
0.1.0 2019 年 6 月 14 日
0.0.1 2019 年 6 月 14 日

#1563 in Rust 模式

Download history 2031/week @ 2024-04-17 1789/week @ 2024-04-24 1978/week @ 2024-05-01 2351/week @ 2024-05-08 1925/week @ 2024-05-15 1611/week @ 2024-05-22 1742/week @ 2024-05-29 1692/week @ 2024-06-05 1578/week @ 2024-06-12 1844/week @ 2024-06-19 1962/week @ 2024-06-26 3110/week @ 2024-07-03 8051/week @ 2024-07-10 7780/week @ 2024-07-17 5233/week @ 2024-07-24 3849/week @ 2024-07-31

每月 25,817 次下载
3 个 crate 中使用

CC0 许可

32KB
124 代码行

almost:用于比较浮点数的 crate。

Docs

本 crate 力求在大多数情况下做出良好的选择,而不是提供一个鼓励误用的复杂 API。

  1. 默认使用相对比较。
  2. 提供单独的函数用于与零比较(这是唯一一个绝对比较是默认选择的合理情况)。
  3. std::{f32,f64}::EPSILON 使用更好的默认容差。
  4. 正确处理无穷大/下溢。
  5. no_std 兼容始终

许可

公有领域,如 此处 解释


lib.rs:

一个用于测试浮点数是否几乎相等的 crate。

// Compare two variables.
if almost::equal(x, y) {
   println!("They're almost equal!");
}
// Or, if you need need to compare with a constant zero:
if almost::zero(z) {
   println!("It's almost zero!");
}

为什么还需要另一个 crate?

已经有许多这样的 crate 了。

作者对该如何实现有相当坚定的意见,并认为大多数类似的 crate 都做出了可疑的选择,使用户易于误用,或者遵循不良的数值稳健性实践。

与其他 crate 的具体差异/优势

  1. 对未知输入的默认容差选择更合理。通常使用 EPSILON 的值作为容差,或者 API 鼓励其使用。

    这种选择比正确的选择更常见。机器的容差是一个相当严格的比较界限,经过几次算术运算后,你将不再处于这个界限内。

    这个库选择了一个默认容差值,它更加宽容,同时仍然足够紧密,不太可能产生误报(特别是,它假设大约一半的位已经丢失到舍入,例如机器容差的平方根)。

  2. 默认进行相对比较。野外的大多数crate似乎使用相对和绝对比较的混合。这对任何规模的任意数字来说都不好,并且放弃了浮点数系统的一些可取属性。

  3. 与零进行绝对比较。默认使用相对比较的唯一缺点是,当其中一个值提前已知为零时,相对比较基本上是没有用的。

    因此,这个库还提供了 almost::zero(v),它使用绝对比较。

  4. 正确处理溢出和下溢。

    因为这个库使用相对比较,所以非正规数字的行为是正确的,以及其中一个值溢出到无穷大的比较。第二个可能听起来不可能,但我们可以重新调整两个值,并使用相同的容差进行比较。

  5. 简单的API。我们不公开其他比较数字的方法,这些方法大多数都是对非典型用例的怀疑选择。

尽管如此,这里没有一刀切的方法。数值鲁棒性充满了权衡,虽然我相信这个库所做的权衡对大多数情况都是好的,但它们并不,也不能满足每一个可能的情况。

无运行时依赖