![](/img/trans.png)
[英]How do I find the largest value smaller than or equal to X and the smallest value greater than or equal to X?
[英]Smallest int value that is smaller than the smallest representable int?
如果T
是整数类型,则std::numeric_limits<T>::infinity()
返回 0。 我可以使用这个 function 的替代品吗? 我有一系列 int 变量(它们可以是int8, uint8, int32, uint32, int64, uint64
),它们可以取最小值(含)和最大值(含)之间的任何值。
我需要一个小于所有这些变量的值,这个值将用于比较目的(我将比较这个值是否小于我的一系列 int 变量)。
我知道我可以像-std::numeric_limits<double>::infinity()
这样的东西,但是如果我要将我的 int 变量与这个值进行比较,比较将以 FP 精度进行,我担心性能的影响。 理想情况下,我希望所有比较都使用整数进行。
我认为我们可以拥有的最小 int 值是std::numeric_limits<int64_t>::minimum()
,所以我认为我的问题本质上是在问我们是否可以获得比这更小的 integer 值?
您可以定义自己的负无穷常数,它比较小于任何其他值。
这对于C++20 的三向比较器(又名宇宙飞船)来说不那么乏味,但在以前的版本中是可行的:
#include <compare>
struct minus_infinity_t {} constexpr minus_infinity;
auto constexpr operator<=> (minus_infinity_t, minus_infinity_t)
{ return std::weak_ordering::equivalent; }
template<class T> auto constexpr operator<=> (T, minus_infinity_t)
{ return std::weak_ordering::greater; }
template<class T> auto constexpr operator<=> (minus_infinity_t, T)
{ return std::weak_ordering::less; }
int main()
{
constexpr int n = 0;
constexpr long long k = 1;
constexpr double l = 2;
static_assert(n > minus_infinity);
static_assert(k > minus_infinity);
static_assert(l > minus_infinity);
static_assert(minus_infinity <= n);
static_assert(minus_infinity <= k);
static_assert(minus_infinity <= l);
}
改进思路:
T
可以与概念
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.