STL或Boost中是否有一组通用的简单比较函数?
我找到的那个总是需要模板参数和/或实例化 结构模板。
我正在寻找具有以下语法的东西:
if ( is_equal(x,y) )
{
...
}
可以实现为:
template <typename T>
bool is_equal(const T& x, const T& y)
{
return ( fabs(x - y) < Precision<T>::eps );
}
编辑:我将运算符更改为相等。 (见下面的评论)
答案 0 :(得分:10)
我不知道有没有这样做的图书馆,也许是因为它像单行一样简单,或者因为它被遗忘了......
一般情况下,您是否确定要在整个应用程序中为给定值的某个给定类型设置epsilon?我个人想根据我正在进行的操作来定制它(即使默认值很好)。
至于你的经营者,为什么不自己设计呢?
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;
}
不平等和大于方法可以简单地从中得出。
附加参数意味着您可能希望为给定的一组计算指定另一个值...应用程序范围的设置太严格。
答案 1 :(得分:1)
你可以在boost测试库的文档中找到“复杂”比较逻辑here的一些原因。
答案 2 :(得分:0)
来自Marcelo Cantos的评论:
...那么你还需要一个&lt;测试一下 返回false,即使是第一个 数字越来越小 比第二个。
我认为实施将是:
return !roughly_equal(a, b) && a < b;