nie wiem o wszelkich biblioteki, która robi to, być może dlatego, że jest tak proste, jak jeden-liner, a może dlatego, że została zapomniana ...
Jak ogólność idzie jednak, czy na pewno” Czy chcesz ustawić epsilon dla jednego danego typu przy danej wartości ... w całej aplikacji? Osobiście chciałbym go dostosować w zależności od operacji, które wykonuję (nawet jeśli domyślnie byłoby miło).
Co do operatorów, dlaczego nie samodzielnie je opracować?
template <class T>
bool rough_eq(T lhs, T rhs, T epsilon = Precision<T>::epsilon) // operator==
{
return fabs(lhs - rhs) < epsilon;
}
template <class T>
bool rough_lt(T lhs, T rhs, T epsilon = Precision<T>::epsilon) // operator<
{
return rhs - lhs >= epsilon;
// tricky >= because if the difference is equal to epsilon
// then they are not equal per the rough_eq method
}
template <class T>
bool rough_lte(T lhs, T rhs, T epsilon = Precision<T>::epsilon) // operator<=
{
return rhs - lhs > -epsilon;
}
Nierówności i większe niż metody mogą być trywialnie wyprowadzone z tego.
Dodatkowy parametr oznacza, że można podać inną wartość dla danego zestawu obliczeń ... ustawienie dla całej aplikacji jest zbyt surowe.
Po co używać epsilon do porównywania większych lub mniejszych? – AshleysBrain
Jedyny przypadek, w którym porównanie epsilon jest potrzebne dla zmiennoprzecinkowych lub podwójnych typów, to porównanie równości "==". więcej lub mniej nie ma żadnego znaczenia w epsilon, ponieważ czego oczekujesz odpowiedzi, gdy są równe? jeśli większe lub mniejsze są zdefiniowane w sposób, o którym wspomniałeś, to w przypadku, gdy są one równe, otrzymasz b = true i a == b = true, co jest nieprawidłowe. Prawidłowe zachowanie polega na tym, że iff a == b, a> b = fałsz, a a Akanksh
@Akanksh, Powyższa implementacja może nie mieć racji, ale nierówności na bazie epsilon mają znaczenie i są ważne dla precyzyjnego scenariusza, który podkreślasz. Jeśli dwie liczby są równe według testu '==' opartego na epsilon, to potrzebujesz również testu '<', który zwraca wartość false, nawet jeśli pierwsza liczba jest zawsze trochę mniejsza od drugiej. –