std::map 부동 소수점 키 비교
std::maps에서 부동 소수점 값을 키로 사용하면 다음과 같은 문제가 발생할 수 있습니다. 부동 소수점 연산의 고유한 부정확성. 한 가지 일반적인 문제는 엄격한 동등성(==)을 사용하여 부동 소수점 키를 비교하는 것이 항상 예상대로 작동하지 않을 수 있다는 것입니다. 겉보기에 정확해 보이는 값이라도 정밀도 오류로 인해 일치하지 않을 수 있기 때문입니다.
주어진 코드 예제에서 루프는 std::map에서 키 3.0을 찾으려고 시도하지만 루프가 = 0.1을 사용하여 검색 키를 증가시키기 때문에 실패합니다. 이는 부동 소수점 정밀도로 인해 예상 키 값과 정확하게 일치하지 않을 수 있습니다. 부정확함.
이 문제를 해결하려면 프로그램에서 std::setprecision 함수를 사용하여 키를 비교할 때 고려할 소수 자릿수를 지정할 수 있습니다. 그러나 이 접근 방식은 키가 정확하게 비교된다는 것을 보장하지 않기 때문에 여전히 신뢰할 수 없습니다.
더 나은 해결책은 std::map에서 대략적인 비교 기능을 사용하는 것입니다. 엡실론 임계값을 사용하여 키 동일성을 결정하는 사용자 지정 비교기를 정의할 수 있습니다. 이를 통해 특정 허용 범위 내에서 키를 비교할 수 있으며 사소한 정밀도 차이를 효과적으로 무시할 수 있습니다.
struct fuzzy_double_comparator { bool operator() (const double a, const double b) const { return std::fabs(a - b) < epsilon; } };
그런 다음 이 비교 함수를 std::map 생성자에 전달하여 대략적인 비교를 사용할 수 있습니다.
std::map<double, double, fuzzy_double_comparator> mymap;
이 접근 방식을 사용하면 부동 소수점 정밀도로 인해 실제 값이 약간 다르더라도 std::map에서 키 3.0을 찾을 수 있습니다. 제한이 있습니다.
위 내용은 부동 소수점 키와 함께 `std::map`을 사용하는 방법: 부정확한 비교에 대한 해결책?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!