【发布时间】:2013-03-15 18:50:38
【问题描述】:
在 C++ 中,假设我有一个类型为 T 的数字 x,它可以是整数或浮点类型。我想找到T 类型的y 中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
您可以考虑另一种更简单的解决方案:
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 是连续的,但事实并非如此,而且我猜在可预见的将来它不会出现在任何地方。
我希望我已经创建并解释了一个有效的用例,并且我没有冒犯原作者。
【问题讨论】:
-
你能举一个例子来说明浮点类型是什么吗?是不是意味着
y的尾数小了一位,指数也一样? -
我对 27.5k 用户的期望更高。
-
@Zoidberg:这是一个合理的问题,没有理由期望具有任何声誉的用户成为所有领域的专家,因此不会有任何问题。
-
如果没有可表示的数字小于
x怎么办? -
@andre 不,不会。尝试任何足够大的数字。两个可表示对象之间的差异在类型范围内是非常量的。
标签: c++ templates math stl generic-programming