template <class T>
struct eps_tolerance
{
eps_tolerance();
eps_tolerance(int bits);
bool operator()(const T& a, const T& b)const;
};
<eps_tolerance
>- обычное условие терминации, используемое с этими функциями поиска корней. Его<operator()
>возвращает истинность, когда относительное расстояние междуaиbменьше, чем в четыре раза больше эпсилона машины для T, или 21-бит, в зависимости от того, что больше. Другими словами, вы устанавливаетебитына количество битов точности, которые вы хотите в результате. Минимальная толерантностьв четыре раза выше, чем у машинного эпсилона типа Т, необходима для обеспечения того, чтобы мы получили обратно интервал скобки, поскольку он должен быть явно больше, чем один эпсилон в размере. Хотя теоретически можно достичь максимального расстояния в два раза больше машинного эпсилона, на практике это приводит к большому «трэшированию», учитывая, что функция, корень которой находится, может быть точной только до 1 эпсилона в лучшем случае.
struct equal_floor
{
equal_floor();
template <class T> bool operator()(const T& a, const T& b)const;
};
Это условие терминации используется, когда вы хотите найти целочисленный результат, который являетсяэтажомистинного корня. Он заканчивается, как только оба конца интервала имеют один и тот жеэтаж.
struct equal_ceil
{
equal_ceil();
template <class T> bool operator()(const T& a, const T& b)const;
};
Это условие терминации используется, когда вы хотите найти целочисленный результат, который являетсяпотолкомистинного корня. Он завершится, как только оба конца интервала будут иметь одинаковыйпотолок.
struct equal_nearest_integer
{
equal_nearest_integer();
template <class T> bool operator()(const T& a, const T& b)const;
};
Это условие терминации используется, когда вы хотите найти целочисленный результат, который являетсяближайшимк истинному корню. Он завершится, как только оба конца интервала округлятся до одного и того же ближайшего целого числа.