Я начал использовать Boost ICL и наткнулся на очень простые вещи. Например, функция contains
должен возвращать true или false в зависимости от того, находится ли данный элемент в интервале или нет. Однако это работает для [right,left]_open_intervals
но не для [open,closed]_inteval
(см. пример ниже).
Это кажется слишком очевидным, чтобы быть упущением. Я использую библиотеку по назначению?
Например (используя gcc 4.8 или clang 3.3 и Boost 1.54):
#include <boost/concept_check.hpp> //needed to make this MWE work, boost icl should include it internally
#include<boost/icl/right_open_interval.hpp>
#include<boost/icl/closed_interval.hpp>
#include<boost/icl/open_interval.hpp>
int main(){
boost::icl::right_open_interval<double> roi(6.,7.);
assert(boost::icl::contains(roi, 6.) == true); //ok
assert(boost::icl::contains(roi, 6.) == false); //ok
boost::icl::closed_interval<double> oi(4.,5.); // or open_interval
assert(boost::icl::contains( oi, 4.) == false); //error: "candidate template ignored"assert(boost::icl::contains( oi, 5.) == false); //error: "candidate template ignored"}
Примечание. Вышеуказанные значения называются «статическими» интервалами (поскольку их связанные свойства являются частью типа). Динамические интервалы работают как положено.
Я предполагаю, что это сводится к относительной бесполезности тестирования на равенство с плавающей точкой.
Вы когда-нибудь пытались сделать assert(0.1 + 0.2 == 0.3)
?
Попытайся. Я буду ждать.
Если вы уже знаете ответ, будет понятно, почему закрытый интервал не так просто реализовать правильно. Справочные материалы:
Кроме того, если у вас есть два последовательных закрытых интервала [a,b][b,c]
, в каком интервале b
принадлежат?
Других решений пока нет …