我在寻找最简洁和一般的实现以下功能:最简洁的实现与环绕溢出浮点约束功能的
float Constrain(float value, float min, float max);
凡约束()范围内的[min, float)
界定value
。即,范围包括最小值,但不包括max
和values
大于max
或小于min
环绕一圈。也就是说,以类似的方式整数溢出/下溢。
功能应通过以下测试:
Constrain( 0.0, 0.0, 10.0) == 0.0
Constrain(10.0, 0.0, 10.0) == 0.0
Constrain( 5.0, 0.0, 10.0) == 5.0
Constrain(15.0, 0.0, 10.0) == 5.0
Constrain(-1.0, 0.0, 10.0) == 9.0
Constrain(-15.0, 0.0, 10.0) == 5.0
Constrain( 0.0, -5.0, 5.0) == 0.0
Constrain( 5.0, -5.0, 5.0) == -5.0
Constrain( 0.0, -5.0, 5.0) == 0.0
Constrain(10.0, -5.0, 5.0) == 0.0
Constrain(-6.0, -5.0, 5.0) == 4.0
Constrain(-10.0, -5.0, 5.0) == 0.0
Constrain(24.0, -5.0, 5.0) == 4.0
Constrain( 0.0, -5.0, 0.0) == -5.0
Constrain( 5.0, -5.0, 0.0) == -5.0
Constrain(10.0, -5.0, 0.0) == -5.0
Constrain(-3.0, -5.0, 0.0) == -3.0
Constrain(-6.0, -5.0, 0.0) == -1.0
Constrain(-10.0, -5.0, 0.0) == -5.0
注意,min
PARAM可以被认为是总数值小于max
。
有可能是一个非常简单的公式来解决这个问题,但我是惊人的愚蠢不知道它的广义解决方案。
几乎FMOD(和fmodf)确实。但不完全。这就是我的目标。我认为我最喜欢最好的一个。较少的分支(取决于当然如何在libc中实现floor())。我会试一试并报告我的结果。 – orj 2011-03-14 22:17:10
无赖。第二个实施选项不通过测试。首先是。 – orj 2011-03-14 22:22:03
糟糕。全脑失败。再试一次。抱歉! – 2011-03-14 22:50:37