在 C++ 中,假设我有许多x
类型T
,可以是整数或浮点类型。我想找到最多的y
类型。该解决方案需要模板化,以透明地处理整数和浮点数。您可能会忽略已经是可以在 a 中表示的最小数字的边缘情况。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都是实数,因此无法计算流动(或至少相当棘手) 。
然而,当S是浮点数的集合时,这是一个非常有效的原则,因为我们本质上是在处理一个可数集合;那么就没有开放或封闭的界限这样的东西了。也就是说,>= 可以用 > 来定义,就像在 lower_bound 类中所做的那样。
为简化代码,我使用 +0.1 来模拟开放的下限。当然,0.1 是一个粗略的值,因为在浮点表示中可能存在值 z 使得 value < z <= value+0.1 或 value+0.1 == value。因此@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,而不是结构。从技术上讲,使用第二种实现的唯一原因是因为您假设双精度数是连续的,而事实并非如此,我想在可预见的将来它不会出现在任何地方。
我希望我已经创建并解释了一个有效的用例,并且我没有冒犯原作者。