最大数量< X?

时间:2013-03-15 18:50:38

标签: c++ templates math stl generic-programming

在C ++中,假设我有x类型的T,它可以是整数或浮点类型。我想找到y所占类型T的最大数量y < x。需要模板化解决方案以使用整数和浮点数透明地工作。您可以忽略x已经是T中可以表示的最小数字的边缘情况。

可能的使用案例:这个问题被标记为过于本地化,因此我想提供一个我认为更通用的用例。请注意,我不是OP的原作者。

考虑这个结构:

struct lower_bound {
    lower_bound(double value, bool open) : value(open? value+0.1 : value) {}
    double value;
    bool operator()(double x) { return x >= value; }
};

此类模拟下限,可以打开或关闭。当然,在真实(双关语)生活中,我们不能这样做。计算 S 为所有实数时,流动是不可能的(或至少相当棘手)。

enter image description here

但是,当 S 是浮点数的集合时,这是一个非常有效的原则,因为我们处理的是一个可数集合;然后没有开放或封闭的界限。也就是说,&gt; =可以用&gt;来定义。就像在lower_bound类中完成一样。

为简化代码,我使用+0.1来模拟开放的下界。当然,0.1是粗略值,因为可能存在值z,使得值<1。 z&lt; = value + 0.1或值+ 0.1 ==浮点表示中的值。因此@ brett-hale答案非常有用:)

您可以考虑另一种更简单的解决方案:

struct lower_bound {
    lower_bound(double value, bool open) : open(open), value(value) {}
    bool open;
    double value;
    bool operator()(double x) { return (open ? x > value : x>=value); }

};

但是,由于sizeof(Lower_bound)较大,而且operator()需要执行更复杂的语句,因此效率较低。第一个实现非常有效,也可以简单地实现为double,而不是结构。从技术上讲,使用第二个实现的唯一原因是因为你假设一个double是连续的,而它不是,我想它在可预见的未来不会是任何地方。

我希望我创建并解释了一个有效的用例,并且我没有冒犯原作者。

1 个答案:

答案 0 :(得分:10)

如果你有C ++ 11,可以在std::nextafter中使用<cmath>

if (std::is_integral<T>::value)
    return (x - 1);
else
    return std::nextafter(x, - std::numeric_limits<T>::infinity());