2014-12-18 12 views
6

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.

+3

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))

cevap

5
Sen T sizin formülle gerekli toplama, çıkarma ve karşılaştırma özelliklerini desteklemelidir Sadece bu değil, yerleşik bir sayı tipi olması gerektiğini belirtmek gerekmez

:

fn fuzzy_cmp<T: Add<T, T> + Sub<T, T> + PartialOrd>(a: T, b: T, tolerance: T) -> bool { 
    a >= b - tolerance && a <= b + tolerance 
} 
+0

Benzer bir çözüm buldum. 'T: PartialOrd + + Alt + Kopyala 'yı ekleyin. – antonone

+0

Gerçekten, düzeltme için teşekkürler. Çok hızlı yazdım ve OP'nin kullanım durumunun tamamını kontrol etmedim. Gönderinin üstü düzenlenmiştir. – dummydev