c++ - 最大数 < x?

标签 c++ templates math stl generic-programming

在 C++ 中,假设我有一个数字 x类型 T它可以是整数或浮点类型。我想找到最大的数 y类型 T为此 y < x持有。该解决方案需要模板化以透明地处理整数和 float 。您可以忽略 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 是 float 集时,这是一个非常有效的原则,因为我们处理的本质上是一个可数集;然后就没有开放或封闭界限这样的东西了。也就是说,>= 可以根据 > 来定义,就像在 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 ,而不是结构体。从技术上讲,使用第二种实现的唯一原因是因为您假设 double 是连续的,而事实并非如此,而且我想在可预见的 future 它不会出现在任何地方。

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

最佳答案

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

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

关于c++ - 最大数 < x?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15440052/

相关文章:

c++ - 如何通过函数指针调用派生方法?

python - 用 Python 分解三项式

c# - 帮助优化整数数学

c++ - 函数不会更改传递的指针 C++

c++ - 通用类型别名,它们彼此不兼容

c++ - Alexandrescu 的想法与现代 C++ 相关吗?

c++ - 行外成员定义的类型说明符中可以省略 typename 吗?

Java:为什么乘以大的正数会导致负结果?

android - 如何防止 Android 设备从 Qt 应用程序进入休眠状态

c++ - 如何比较参数字符串 Visual C++