【问题标题】:Largest Number < x?最大数 < x?
【发布时间】:2013-03-15 18:50:38
【问题描述】:

在 C++ 中,假设我有一个类型为 T 的数字 x,它可以是整数或浮点类型。我想找到T 类型的yy &lt; 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


【解决方案1】:

如果你有 C++11,你可以在 &lt;cmath&gt; 中使用 std::nextafter

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
  • 1970-01-01
  • 2022-11-20
  • 1970-01-01
相关资源
最近更新 更多