gpt4 book ai didi

c++ - 最大数 < x?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:19:18 26 4
gpt4 key购买 nike

在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com