gpt4 book ai didi

math - 仅使用算术限制最小值和最大值之间的值

转载 作者:行者123 更新时间:2023-12-02 17:02:53 24 4
gpt4 key购买 nike

是否可以仅使用算术将值限制在最小值和最大值之间的给定范围内?即 + - x /%

我无法使用 min 等功能, max也不IF -声明。

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

我试过:

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

但对于低于 xmin 的值,它会在范围中间给出不同的值.

最佳答案

如果知道整数类型的大小,则可以使用整数除法提取其符号位(假设为二进制补码):

// Example in C
int sign_bit(int s)
{
// cast to unsigned (important)
unsigned u = (unsigned)s;

// number of bits in int
// if your integer size is fixed, this is just a constant
static const unsigned b = sizeof(int) * 8;

// pow(2, b - 1)
// again, a constant which can be pre-computed
static const unsigned p = 1 << (b - 1);

// use integer division to get top bit
return (int)(u / p);
}

如果 s < 0 则返回 1否则为0;它可以用来计算绝对值:

int abs_arith(int v)
{
// sign bit
int b = sign_bit(v);

// actual sign (+1 / -1)
int s = 1 - 2 * b;

// sign(v) * v = abs(v)
return s * v;
}

所需的功能如下所示:

enter image description here

首先将最小值移动到零是有用的:

enter image description here

此函数形式可以计算为以下两个移位绝对值函数的总和:

enter image description here

然而,结果函数被缩放了 2 倍;转移到零在这里有帮助,因为我们只需要除以 2,然后转移回原来的最小值:

// Example in C
int clamp_minmax(int val, int min, int max)
{
// range length
int range = max - min;

// shift minimum to zero
val = val - min;

// blue function
int blue = abs_arith(val);

// green function
int green = range - abs_arith(val - range);

// add and divide by 2
val = (blue + green) / 2;

// shift to original minimum
return val + min;
}

此解决方案虽然满足问题的要求,但仅限于有符号整数类型(以及允许整数溢出的语言 - 我不确定如何在 Java 中克服这一点)。

关于math - 仅使用算术限制最小值和最大值之间的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53186524/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com