STL,BOOST中的浮点比较

时间:2010-05-14 09:42:37

标签: c++ floating-point

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 );
}

编辑:我将运算符更改为相等。 (见下面的评论)

3 个答案:

答案 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;