Есть ли в STL или в Повышении ряд универсальных простых функций сравнения?
Тот, который я нашел, всегда требует шаблонных параметров и/или инстанцирования шаблона структуры.
Я ищу что-то с синтаксисом как:
if ( is_equal(x,y) )
{
...
}
Который мог быть реализован как:
template <typename T>
bool is_equal(const T& x, const T& y)
{
return ( fabs(x - y) < Precision<T>::eps );
}
Править: Я изменил оператор для равенства. (см. комментарии ниже),
Я не знаю ни одной библиотеки, которая бы это делала, возможно, потому что она такая же простая, как однострочная, или, возможно, потому, что она была забыта ...
В общем, вы уверены, что хотите установить эпсилон для одного заданного типа с заданным значением ... во всем приложении? Лично я хотел бы настроить его в зависимости от выполняемых мной операций (хотя было бы неплохо использовать значение по умолчанию).
Что касается ваших операторов, почему бы не придумать их самостоятельно?
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;
}
Из этого можно легко вывести неравенство и методы «больше чем».
Дополнительный параметр означает, что вы можете указать другое значение для данного набора вычислений ... слишком строгие настройки для всего приложения.
Некоторые причины "сложной" логики сравнения можно найти здесь, в документации библиотеки тестов boost.
Из комментария Marcelo Cantos:
...тогда вам также нужен <тест, который возвращает false, даже если первое число хоть немного меньше чем второе.
Я предполагаю, что реализация будет такой:
return !roughly_equal(a, b) && a < b;