Сравнение с плавающей точкой в STL, ПОВЫШЕНИИ

Есть ли в 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 );
}

Править: Я изменил оператор для равенства. (см. комментарии ниже),

9
задан Donal Fellows 14 May 2010 в 01:37
поделиться

3 ответа

Я не знаю ни одной библиотеки, которая бы это делала, возможно, потому что она такая же простая, как однострочная, или, возможно, потому, что она была забыта ...

В общем, вы уверены, что хотите установить эпсилон для одного заданного типа с заданным значением ... во всем приложении? Лично я хотел бы настроить его в зависимости от выполняемых мной операций (хотя было бы неплохо использовать значение по умолчанию).

Что касается ваших операторов, почему бы не придумать их самостоятельно?

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

Из этого можно легко вывести неравенство и методы «больше чем».

Дополнительный параметр означает, что вы можете указать другое значение для данного набора вычислений ... слишком строгие настройки для всего приложения.

10
ответ дан 3 November 2019 в 00:59
поделиться

Некоторые причины "сложной" логики сравнения можно найти здесь, в документации библиотеки тестов boost.

1
ответ дан 3 November 2019 в 00:59
поделиться

Из комментария Marcelo Cantos:

...тогда вам также нужен <тест, который возвращает false, даже если первое число хоть немного меньше чем второе.

Я предполагаю, что реализация будет такой:

return !roughly_equal(a, b) && a < b;
0
ответ дан 3 November 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: