나는 녹에 "퍼지 비교"기능을 쓰려고합니다. 나는 일반 버전으로 변환에 문제가숫자 유형의 "퍼지 비교"에 사용할 수있는 특성은 무엇입니까?
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
은 더 이상 사용되지 않으므로 사용하지 않으려 고합니다.
참고 :이 될 것으로 보인다을 부동 소수점 수를 비교하는 일반적인 "엡실론"방법이지만,이 방법에 문제가 있다는 것을 알고 있어야합니다.> 크기 변화. ''엡실론 == b''와''b + 엡실론 ==b''가 있기 때문에 절대 값 "엡실론"은'a'와'b'가 상당히 큰 크기 일 때 작동하지 않습니다. 당신은 분명히 integrals에 대한 문제가되지 않습니다. 따라서 부동 소수점의 경우 * 상대 * 엡실론을 조사 할 수 있습니다. 즉 'abs (a - b)/max (abs (a), abs (b)) <엡실론'이며, 대신에 a와 b가 서로 N % 이내임을 보장합니다. –