Math 仅使用算术将值限制在最小值和最大值之间

Math 仅使用算术将值限制在最小值和最大值之间,math,max,min,plc,clamp,Math,Max,Min,Plc,Clamp,是否可以仅使用算术将值限制在给定范围内(最小值和最大值之间)?也就是说,+-x/和% 我无法使用诸如min、max或IF-语句之类的函数 假设我的范围是[18501880],对于任何值1880,应显示1880。如果仅显示范围外的1850,也可以接受 我试过: x = (((x - xmax) % (xmax - xmin)) + (xmax - xmin)) % (xmax - xmin) + xmin 但在中值范围内给出的值小于 XMI。< P>如果知道整数类型的大小,可以使用整数除法提取

是否可以仅使用算术将值限制在给定范围内(最小值和最大值之间)?也就是说,
+
-
x
/
%

我无法使用诸如
min
max
IF
-语句之类的函数

假设我的范围是
[18501880]
,对于任何值
<1850
,它都应该显示
1850
。对于值
>1880
,应显示
1880
。如果仅显示范围外的
1850
,也可以接受

我试过:

x = (((x - xmax) % (xmax - xmin)) + (xmax - xmin)) % (xmax - xmin) + xmin 

但在中值范围内给出的值小于<代码> XMI。

< P>如果知道整数类型的大小,可以使用整数除法提取它的符号位(假设两个补):

//C语言中的示例
整数符号\位(整数s)
{
//强制转换为未签名(重要)
无符号u=(无符号)s;
//整数位数
//如果整数大小是固定的,则这只是一个常量
静态常数无符号b=sizeof(int)*8;
//战俘(2,b-1)
//同样,可以预先计算的常数

static const unsigned p=1我在…excel中乱搞时发现了这一点。它只适用于严格正整数。虽然这并不像meowgoesthedog的答案那样限制性更大,因为他还通过在末尾除以2有效地将整数空间减半。它不使用mod

//A = 1 if x <= min
//A = 0 if x >= min
A = 1-(min-min/x)/min 

//B = 0 if x <= max
//B = 1 if x > max
B = (max-max/x)/max

x = A*min + (1-A)*(1-B)*x + B*max
//如果x=min,则A=1
A=1-(最小值/x)/min
//如果x最大,则B=0
B=(最大值/x)/max
x=A*最小值+(1-A)*(1-B)*x+B*最大值

我在Python中找到了这个解决方案:

A = -1  # Minimum value
B = +1  # Maximum value
x = min(max(x, A), B)

“数字”在计算机科学中是不明确的。你说的是什么类型的数字?有符号整数?固定长度无符号?双精度?请澄清。另外,如果你有一种编程语言,请规定。运算符
/
%
在不同的编程语言中有不同的语义。@johncolman这是IEC 61131-3种语言,数据类型是任意整数。为了简单起见,让我们假设我的问题是关于一个有符号整数。通过“/”我指的是除法,“%”我指的是模运算,在我的例子中,它实际上是“MOD”,所以通过“除法”你指的是“整数(截断)除法”?另外,
%
如何处理负值(因为您谈论的是有符号整数)?这是不同编程之间存在差异的一个领域languages@JohnColeman是的,整数截断除法。至于
%
,在我的例子中,结果与除数有相同的符号。@phuclv关于PLC的事情,是的,在本质上它是一个微控制器,但是你只在制造商的IDE中工作,你是被迫的吃他们做的东西,这不是ANSI C。当然,在标准PLC语言中,IFs和compares是可用的,即使在最早期的PLC中也是如此。这就是为什么我怀疑这是一些边缘情况,他被迫使用“计算”功能块或其他什么。这令人印象深刻(+1)虽然考虑到原始问题中的模糊性,但无法判断它是否满足他们对解决方案的任何未声明的约束。@JohnColeman的确,我知道这个解决方案做出了相当严格的假设。同时,我将尝试考虑一个更一般的假设。我怀疑如果没有很多约束,那么解析是不可能的。我做了一些测试,这对我的应用程序中所有可能的值都很有效,除了
0
。它提供了最大的范围。但这是我可以接受的,因为我可以用
值>0
初始化
x
变量。我建议先将while值向上移动16k或大约然后后退16k。这样它也适用于0和负片。(别忘了移动最小值和最大值。)OP已经声明只允许
+-x/%