c – Boost ICL中函数“contains”的基本用法:区间类型和函数的某些组合是否未实现?

我开始使用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"
}

注意:以上称为“静态”区间(因为它们的绑定属性是类型的一部分).动态间隔按预期工作.

最佳答案 我猜它归结为浮点相等测试的相对无用.

你有没有试过断言(0.1 0.2 == 0.3)?

试试吧.我会等.

如果您已经知道答案,那么很清楚为什么闭合间隔不容易正确实现.背景资料:

> Is floating point math broken?
> Why doesn’t GCC optimize a*a*a*a*a*a to (a*a*a)*(a*a*a)?
> What Every Programmer Should Know About Floating-Point Arithmetic

此外,如果您有两个连续的闭合间隔[a,b] [b,c]. b属于哪个区间?

点赞