3 个版本 (破坏性)
0.2.0 | 2019 年 8 月 11 日 |
---|---|
0.1.0 | 2019 年 6 月 14 日 |
0.0.1 | 2019 年 6 月 14 日 |
#1563 in Rust 模式
每月 25,817 次下载
在 3 个 crate 中使用
32KB
124 代码行
almost:用于比较浮点数的 crate。
本 crate 力求在大多数情况下做出良好的选择,而不是提供一个鼓励误用的复杂 API。
- 默认使用相对比较。
- 提供单独的函数用于与零比较(这是唯一一个绝对比较是默认选择的合理情况)。
- 比
std::{f32,f64}::EPSILON
使用更好的默认容差。 - 正确处理无穷大/下溢。
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 的具体差异/优势
-
对未知输入的默认容差选择更合理。通常使用
EPSILON
的值作为容差,或者 API 鼓励其使用。这种选择比正确的选择更常见。机器的容差是一个相当严格的比较界限,经过几次算术运算后,你将不再处于这个界限内。
这个库选择了一个默认容差值,它更加宽容,同时仍然足够紧密,不太可能产生误报(特别是,它假设大约一半的位已经丢失到舍入,例如机器容差的平方根)。
-
默认进行相对比较。野外的大多数crate似乎使用相对和绝对比较的混合。这对任何规模的任意数字来说都不好,并且放弃了浮点数系统的一些可取属性。
-
与零进行绝对比较。默认使用相对比较的唯一缺点是,当其中一个值提前已知为零时,相对比较基本上是没有用的。
因此,这个库还提供了
almost::zero(v)
,它使用绝对比较。 -
正确处理溢出和下溢。
因为这个库使用相对比较,所以非正规数字的行为是正确的,以及其中一个值溢出到无穷大的比较。第二个可能听起来不可能,但我们可以重新调整两个值,并使用相同的容差进行比较。
-
简单的API。我们不公开其他比较数字的方法,这些方法大多数都是对非典型用例的怀疑选择。
尽管如此,这里没有一刀切的方法。数值鲁棒性充满了权衡,虽然我相信这个库所做的权衡对大多数情况都是好的,但它们并不,也不能满足每一个可能的情况。