【问题标题】:Basic use of function "contains" in Boost ICL: Are some combinations of interval types and functions not implemented?Boost ICL中“包含”函数的基本使用:区间类型和函数的某些组合没有实现吗?
【发布时间】:2014-03-20 17:11:51
【问题描述】:

我开始使用 Boost ICL,偶然发现了一些非常基本的东西。例如,函数contains 应该返回真或假,具体取决于给定元素是否在区间内。但是,这适用于[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"
}

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

【问题讨论】:

  • 在重读了Boost ICL的文档后,我在一个例子中发现了这个晦涩的评论:“...您可能会使用一种静态间隔right_open_intervals推荐。...静态关闭, left_open 和 open 间隔是为了完整性而实施的,但实际上并不重要。”所以目前我知道除了right_open_interval 以外的任何东西都不能保证有效。我想我可以实现contains 的重载,但如果我坚持使用right_open_interval 以外的间隔,我将来可能会发现另一个限制。

标签: c++ boost boost-icl


【解决方案1】:

我猜这归结为浮点相等测试的相对无用。

你有没有尝试过assert(0.1 + 0.2 == 0.3)

试试看。我等着。

如果您已经知道答案,就会清楚为什么闭区间不容易正确实施。背景资料:

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

【讨论】:

  • 有道理,我想我是出于概念上的原因考虑open_intervals 来解决我的问题。但实际上,我不应该指望浮点值的不同间隔类型和回退到单个间隔类型之间的差异。尽管如此,我会说这个限制是令人惊讶的(尽管它本身就提出了你的优点)。我认为此时我们正在猜测图书馆作者的意图是什么。 ([b.c]中应该有逗号)
  • 此外,间隔的动态版本(上述称为静态的)按预期工作(在浮点范围内),例如contains(boost::icl::interval&lt;double&gt;::open(1.,5.),5.) == false
  • 我同意静态间隔的功能集似乎不对称 w.r.t。动态间隔的特征集。嗯。
  • 多使用该库我意识到(至少对于连续变量)没有努力将静态(-bounds)间隔与 inteval-containers 和动态(-bounds)间隔(不是甚至转换)。所以最后,静态间隔就像图书馆剩下的一个不起眼的角落。
猜你喜欢
  • 1970-01-01
  • 2015-06-20
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
  • 2019-04-14
  • 2010-10-09
相关资源
最近更新 更多