剪辑数字的最有效/优雅的方式?

新手上路,请多包涵

给定一个实数(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;
}

我敢肯定还有其他更好的方法可以做到这一点,这就是我把它放在那里的原因..!

原文由 Alex Z 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 477
2 个回答

无聊、陈旧、可读且最短的呢:

 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));
}

更新

比利奥尼尔补充说:

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

原文由 justin 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您想使用 xtensor,它将支持多维数组,并且解决方案将非常优雅。

 #include <iostream>
#include "xtensor/xarray.hpp"
#include "xtensor/xio.hpp"
#include "xtensor/xview.hpp"
#include "xtensor/xrandom.hpp"
xt::xarray<float> ar({2.1, 2.9, -2.1, -2.9});
std::cout<<xt::cast<int>(xt::trunc(ar))<<std::endl;

//答案是 { 2, 2, -2, -2 }

原文由 Achyut Sarma 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题