一尘不染

截断数字最有效/最优雅的方法?

algorithm

给定一个实数(n),该实数的最大值可以是(上),而该实数的最小值可以是(下),我们如何最有效地裁剪n,使其保持在上下限之间?

当然,使用一堆if语句可以做到这一点,但这很无聊!那么更紧凑,优雅/有趣的解决方案呢?

我自己的快速尝试(C / C ++):

float clip( float n, float lower, float upper )
{
    n = ( n > lower ) * n + !( n > lower ) * lower;
    return ( n < upper ) * n + !( n < upper ) * upper;
}

我敢肯定还有其他更好的方法可以做到这一点,这就是为什么我要把它放在那里。


阅读 253

收藏
2020-07-28

共1个答案

一尘不染

那么无聊,古老,可读和最短的时间呢?

float clip(float n, float lower, float upper) {
  return std::max(lower, std::min(n, upper));
}

该表达式也可以像这样被“通用化”:

template <typename T>
T clip(const T& n, const T& lower, const T& upper) {
  return std::max(lower, std::min(n, upper));
}

更新资料

Billy ONeal添加了:

请注意,在Windows上,您可能必须定义NOMINMAX,因为它们定义了冲突的最小和最大宏

2020-07-28