Rust'ta "fuzzy compare" fonksiyonu yazmaya çalışıyorum. Ben genel bir sürüme dönüşümünde bir sorun varSayısal türlerin "bulanık karşılaştırması" için hangi özelliği kullanabilirim?
fn fuzzy_cmp(a: f64, b: f64, tolerance: f64) -> bool {
a >= b - tolerance && a <= b + tolerance
}
: Burada
bir örnektir. Doğal ve kayan nokta sayılarını gruplandıran, üzerinde aritmetik işlemler gerçekleştirmeye izin veren bir özellik var mı? Böyle bir şey:fn fuzzy_cmp<T: Numbers>(a: T, b: T, tolerance: T) -> bool {
a >= b - tolerance && a <= b + tolerance
}
ben gibi durumlarda bu işlevi kullanmak istiyorum:
fuzzy_cmp(x, 20u64, 5u64)
fuzzy_cmp(y, 20f64, 5f64)
// ... etc
Zaten Ord
özelliğini denedim ama çalışmıyor:
28:23 error: binary operation `-` cannot be applied to type `T`
a >= b - tolerance && a <= b + tolerance
^~~~~~~~~~~~~
Trait core::num::Num
, kullanımdan kaldırılmış gibi görünüyor, bu yüzden kullanmaya çalışmıyorum bile.
Not: Bu gibi görünüyor kayan nokta sayılarını karşılaştırmak için tipik "epsilon" yöntemi, ancak bu yöntemle ilgili bir sorun olduğu bilinmelidir => büyüklük varyasyonları. Mutlak bir "epsilon" a "ve" b "anlamlı bir şekilde daha yüksek bir büyüklükte olduğunda çalışmayacaktır, çünkü o zaman b - epsilon == b" ve "b + epsilon == b". Açıkçası, integraller için sorun olmayacak. Kayan noktalarda, bu nedenle, * göreli * epsilonları araştırmak isteyebilirsiniz; Bu, abs (a - b)/max (abs (a), abs (b))