Ale*_*x Z 47 c++ algorithm math logic
给定一个实数(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;
}
Run Code Online (Sandbox Code Playgroud)
我确信还有其他更好的方法可以做到这一点,这就是为什么我把它放在那里......!
jus*_*tin 79
无聊,旧,可读和最短的东西:
float clip(float n, float lower, float upper) {
return std::max(lower, std::min(n, upper));
}
Run Code Online (Sandbox Code Playgroud)
?
这个表达式也可以像这样"泛化":
template <typename T>
T clip(const T& n, const T& lower, const T& upper) {
return std::max(lower, std::min(n, upper));
}
Run Code Online (Sandbox Code Playgroud)
更新
Billy ONeal补充道:
请注意,在Windows上,您可能必须定义NOMINMAX,因为它们定义了冲突的最小和最大宏
Rio*_*iot 41
为什么重写已经为你写的东西?
#include <boost/algorithm/clamp.hpp>
boost::algorithm::clamp(n, lower, upper);
Run Code Online (Sandbox Code Playgroud)
从C++ 17开始,这现在是STL的一部分:
#include <algorithm>
std::clamp(n, lower, upper);
Run Code Online (Sandbox Code Playgroud)
Jos*_*ley 20
C++ 17有望增加钳位功能.由cppreference.com提供:
template<class T>
constexpr const T& clamp( const T& v, const T& lo, const T& hi );
template<class T, class Compare>
constexpr const T& clamp( const T& v, const T& lo, const T& hi, Compare comp );
Run Code Online (Sandbox Code Playgroud)
Ton*_*roy 16
我很少超越......
return n <= lower ? lower : n >= upper ? upper : n;
Run Code Online (Sandbox Code Playgroud)
如果你知道你可能有它们,你想检查NaN/Inf等是否被保留....
我很少说,也绝不仅仅因为有时较少的分支可以更快,但你肯定想要描述它并证明它有帮助和重要....
小智 6
the best is clearly
template <typename t>
t clamp2(t x, t min, t max)
{
if (x < min) x = min;
if (x > max) x = max;
return x;
}
Run Code Online (Sandbox Code Playgroud)
as it compiles to
movss xmm0, cs:__real@c2c80000
maxss xmm0, [rsp+38h+var_18]
movss xmm1, cs:__real@42c80000
minss xmm1, xmm0
movss [rsp+38h+var_18], xmm1
Run Code Online (Sandbox Code Playgroud)
it has 0 branches and should be the fastest of all posted above.
also msvc141 with the standard release settings
您可能喜欢三元运算符:
value = value<lower?lower:value;
value = value>upper?upper:value;
Run Code Online (Sandbox Code Playgroud)
优雅,不安全,昂贵但无分支机构:
n= 0.5 * (n + lower + fabs(n - lower));
n= 0.5 * (n + upper - fabs(upper - n));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
57326 次 |
| 最近记录: |