Основное использование функции «содержит» в Boost ICL: некоторые комбинации интервальных типов и функций не реализованы?

Я начал использовать 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"}

Примечание. Вышеуказанные значения называются «статическими» интервалами (поскольку их связанные свойства являются частью типа). Динамические интервалы работают как положено.

4

Решение

Я предполагаю, что это сводится к относительной бесполезности тестирования на равенство с плавающей точкой.

Вы когда-нибудь пытались сделать assert(0.1 + 0.2 == 0.3)?

Попытайся. Я буду ждать.

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

Кроме того, если у вас есть два последовательных закрытых интервала [a,b][b,c], в каком интервале b принадлежат?

2

Другие решения

Других решений пока нет …