在C ++中,我会使用boost::clamp
。基本上我有一些excel功能
A1*B2+C3+D4
我想将其约束为+/-某个数字,将其称为X1
。显而易见的是:
MAX(-X1, MIN(X1, A1*B2+C3+D4))
但我希望能够做到这一点:
CLAMP(A1*B2+C3+D4, -X1, X1)
这或类似的东西存在吗?我只是很好奇 - 显然这种解决方法有效,它只是丑陋。
答案 0 :(得分:21)
这可以使用MEDIAN完成。 MEDIAN选择三个值的中间值,从而有效地限制下限和上限。
例如,假设您的最小值为5,最大值为10:
=MEDIAN(5,0,10)
是5
=MEDIAN(5,7,10)
是7
=MEDIAN(5,12,10)
是10
答案 1 :(得分:0)
使用电子表格公式我不认为你可以比min / max构造做得更好。您可以在VBA中写clamp
:
Function clamp(x As Double, lower As Double, upper As Double) As Double
If x < lower Then
clamp = lower
ElseIf x > upper Then
clamp = upper
Else
clamp = x
End If
End Function
如果您在标准代码模块中输入,那么您可以例如做这样的事情:
在A栏中,我的值在0到2 * pi范围内。在C2中,我的值为0.5。在B1中我输入了
=clamp(SIN(A1),-$C$2,$C$2)
并复制下来。该图显示了结果。
(由于我提供了VBA解决方案,我将添加Excel-VBA标记。即使您更喜欢非VBA解决方案,未来其他人也可能会搜索问题并熟悉VBA溶液)。