Как было сказано ранее, определение операторов сравнения вызывает небольшую проблему. Существует множество способов их определения, в зависимости от типа возврата или ожидаемого порядка. Именно поэтому смысл операторов не фиксируется раз и навсегда.
На то, как определяются операторы, могла повлиять политика, как это уже имеет место для округления и проверки. Однако сравнения являются скорее внешним свойством класса, чем внутренним. Они предназначены для локальной модификации, независимо от типа интервалов.
Операторы<<>,<<=>,<>>,<>=>,<==>,<!=>определяются каждый раз; и, подобно арифметическим операторам, они могут принимать аргумент базового типа. Однако из-за технических ограничений этот базовый тип может быть только вторым аргументом; поэтому операторы, к сожалению, не полностью симметричны. Тип возврата не всегда<bool>, так как некоторые интересные результаты могут быть достигнуты с помощью типа возврата трех состояний. Вот общие подписи операторов:
template<class T, class Policies1, class Policies2>
return_type operator== (const interval<T, Policies1>&, const interval<T, Policies2>&);
template<class T, class Policies>
return_type operator== (const interval<T, Policies>&, const T&);
vided comparisons
Default comparison
Если ничего не указано, значение операторов сравнения является расширением оператора по базовому типу. Точнее, если один из аргументов недействителен или пуст, бросается исключение. Если аргументы действительны, применяются следующие правила для определения результата [a,b]<op>c,d] [просто рассмотритеc<==>d, если второй аргумент имеет тип<T>:
х∈ [a,b] ∀y∈ [c,d](xopy), затемtrue
x∈a,b∀y∈c,d!(xopy), затемfalse
В противном случае - исключение.
Это сравнение позволяет заменить базовые типы на интервальные без изменения значения программы. Действительно, если ни одно исключение не бросается, результат тот же, что и раньше; и если исключение бросается, предыдущее сравнение было неуверенным и должно было быть переписано.
Other comparisons
Другие сравнения выбираются с помощью пространства имен. Эти пространства имен расположены под<boost::numeric::interval_lib::compare>и вызываются:
using namespace boost::numeric::interval_lib::compare::the_comparison_to_select;
После этой строки значение оператора по умолчанию будет заменено значением, расположенным в пространстве имен. Обратите внимание, что из-за правил поиска на C++ невозможно использовать два пространства имен один за другим, и они должны использоваться в разных иерархиях блоков. В противном случае компилятор будет жаловаться на неоднозначных операторов. Подводя итог:
// example 1: BAD
using namespace compare1;
...
using namespace compare2;
...
// example 2: GOOD
{ using namespace compare1;
... }
{ using namespace compare2;
... }
// example 3: BAD
using namespace compare1;
...
{ using namespace compare2;
... }
Теперь приходит список представленных сравнений. Все они находятся в соответствующих файлах заголовка<<boost/numeric/interval/compare/...>>. А что касается сравнения по умолчанию, операторы, как правило, жалуются, бросая исключение, если кормить недействительными значениями.
certain: это сравнение эквивалентно схеме по умолчанию с исключительным случаем, нанесенным наfalse. Так что эти операторы отвечаютtrueтолько тогда, когда сравнение проверено для всех пар элементов.
possible: на этот раз исключительный случай сопоставляется сtrue. Операторы отвечаютtrue, как только сравнение проверяется для пары элементов.
lexicographic: лексикографический порядок (сначала сравниваются нижние границы, а если недостаточно знать результат, то сравниваются верхние границы). Этот порядок не имеет значения в интервальной арифметике. Однако, поскольку это естественный общий порядок на паре (полностью упорядоченных) чисел, это может быть удобно в некоторых случаях.
set: установленный порядок включения частичный. На этот раз пустой интервал не считается недействительным (но недействительное число по-прежнему недействительно).<=и<являются подмножеством и надлежащими отношениями подмножества; и>=и>являются надмножеством и надлежащими отношениями надмножества.
triboolЭто сравнение основано на булевой библиотеке Boost tristate и изменяет операторы по умолчанию так, что явное неопределенное значение возвращается в третьем случае вместо того, чтобы бросать исключение.
В некоторых ситуациях вы можете выполнить прямое сравнение на границах и избежать неопределенного случая, который появляется у операторов по умолчанию. Для этой цели предусмотрены некоторые функции. Они ожидают, что их аргументы будут действительны и вернут результат только после одного сравнения. Их имена составлены<cer>(для «определенного», если сравнение по умолчанию истинно, результат верен) или<pos>(для «возможного», если сравнение по умолчанию ложно, результат ложен), за которыми следуют<lt>,<le>,<gt>,<ge>,<eq>или<ne>. Они расположены в<<boost/numeric/interval/compare/explicit.hpp>>. Каждая из этих функций принимает два параметра и возвращает булеву; ожидается, что параметры будут действительными, неопределенное поведение может привести к иному. Например, определение сравнения «безусловно меньше»:
Статья Comparisons раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.