alf*_*lfC 5 c++ boost 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"
}
Run Code Online (Sandbox Code Playgroud)
注意:以上称为“静态”间隔(因为它们的绑定属性是类型的一部分)。动态间隔按预期工作。
我猜想这可以归结为浮点相等测试的相对无用性。
你曾经尝试过这样做吗assert(0.1 + 0.2 == 0.3)?
尝试一下。我会等待。
如果您已经知道答案,就会清楚为什么闭区间不容易正确实现。背景资料:
另外,如果有两个连续的闭区间[a,b][b,c]。属于哪个区间b?