2014-12-18 3 views
6

나는 녹에 "퍼지 비교"기능을 쓰려고합니다. 나는 일반 버전으로 변환에 문제가숫자 유형의 "퍼지 비교"에 사용할 수있는 특성은 무엇입니까?

fn fuzzy_cmp(a: f64, b: f64, tolerance: f64) -> bool { 
    a >= b - tolerance && a <= b + tolerance 
} 

: 여기

은 예입니다. 자연수와 부동 소수점 숫자를 그룹화하고 산술 연산을 수행 할 수있는 특성이 있습니까? 이런 식으로 뭔가 :

fn fuzzy_cmp<T: Numbers>(a: T, b: T, tolerance: T) -> bool { 
    a >= b - tolerance && a <= b + tolerance 
} 

내가 좋아하는 경우에이 기능을 사용하고 싶습니다 :

fuzzy_cmp(x, 20u64, 5u64) 
fuzzy_cmp(y, 20f64, 5f64) 
// ... etc 

이미 Ord 특성을 시도했지만, 그것이 작동하지 않습니다

28:23 error: binary operation `-` cannot be applied to type `T` 
a >= b - tolerance && a <= b + tolerance 
    ^~~~~~~~~~~~~ 

Traits core::num::Num은 더 이상 사용되지 않으므로 사용하지 않으려 고합니다.

+3

참고 :이 될 것으로 보인다을 부동 소수점 수를 비교하는 일반적인 "엡실론"방법이지만,이 방법에 문제가 있다는 것을 알고 있어야합니다.> 크기 변화. ''엡실론 == b''와''b + 엡실론 ==b''가 있기 때문에 절대 값 "엡실론"은'a'와'b'가 상당히 큰 크기 일 때 작동하지 않습니다. 당신은 분명히 integrals에 대한 문제가되지 않습니다. 따라서 부동 소수점의 경우 * 상대 * 엡실론을 조사 할 수 있습니다. 즉 'abs (a - b)/max (abs (a), abs (b)) <엡실론'이며, 대신에 a와 b가 서로 N % 이내임을 보장합니다. –

답변

5
당신은 T는이 수식에 의해 요구되는 덧셈, 뺄셈과 비교 특성을 지원해야 것만, 내장 된 숫자 타입이어야 지정할 필요가 없습니다

:

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

방금 ​​비슷한 해결책을 찾았습니다. 'T : PartialOrd + Add + Sub + Copy'. – antonone

+0

사실, 고마워요. 너무 빨리 입력했기 때문에 OP의 사용 사례 전체를 점검하지 않았습니다. 위의 게시물이 수정되었습니다. – dummydev

관련 문제