包含数字的数学模型

时间:2010-06-11 02:56:01

标签: math

我想写一个简单的代码行,而不是求助于if语句,它会评估一个数字是否在某个范围内。我可以通过使用模数来评估0 - Max。

30 % 90 = 30  //great

但是,如果测试数大于最大值,那么使用模数只会在剩下的0处开始,如果它超过最大值,我希望将其限制为最大值

94 % 90 = 4  //i would like answer to be 90
无论如何,如果我引入范围的最小值,对我来说变得更加复杂。例如:

minimum = 10
maximum = 90

因此,我评估的任何数字都应在范围内,如果低于范围则为最小值,如果高于范围则为最大值

-76 should be 10
2 should be 10
30 should be 30
89 should be 89
98 should be 90
23553 should be 90

是否可以使用一行代码对此进行评估而不使用if语句?

5 个答案:

答案 0 :(得分:3)

简单,但即使不使用if仍然是分支:

r = ( x < minimum ) ? minimum : ( x > maximum ) ? maximum : x;

来自bit twiddling hacks,假设(2 <3)== 1:

r = y ^ ((x ^ y) & -(x < y)); // min(x, y)
r = x ^ ((x ^ y) & -(x < y)); // max(x, y)

将它放在一起,假设min&lt;最大:

r = min^(((max^((x^max)&-(max<x)))^min)&-(x<min));

x<y时的工作原理:

r = y ^ ((x ^ y) & -(x < y));
r = y ^ ((x ^ y) & -(1)); // x<y == 1
r = y ^ ((x ^ y) & ~0); // -1 == ~0
r = y ^  (x ^ y); // (x^y) & ~0 == (x^y)
r = y ^   x ^ y; // y^y == 0
r = x;

否则:

r = y ^ ((x ^ y) & -(x < y));
r = y ^ ((x ^ y) & -(0)); // x<y == 0
r = y ^ ((x ^ y) & 0); // -0 == 0
r = y; // (x^y) & 0 == 0

答案 1 :(得分:3)

可能最简单的方法是使用您的语言中提供的maxmin这样的内容:

max(10, min(number, 90))

在某些语言中,例如Java,JavaScript和C#(可能还有其他)maxminMath类的静态方法。

我使用了clip函数来简化它(这是在JavaScript中):

function clip(min, number, max) {
    return Math.max(min, Math.min(number, max));
}

答案 2 :(得分:1)

使用C / C ++:

value = min*(number < min) +
        max*(number > max) +
        (number <= max && number >= min)*number%max;

以下是简要说明。请注意,代码依赖于两个重要问题才能正常工作。首先,在C / C ++中,布尔表达式可以转换为整数。其次,负数的提醒是它自己的数字。所以,它不是余数的数学定义。我不确定这是由C / C ++标准定义的还是留给实现的。基本上是:

if number < min then:
    value = min*1 +
            max*0 +
            0*number%max;
else if number  > max
    value = min*0 +
            max*1 +
            0*number%max;
else
    value = min*1 +
            max*1 +
            1*number%max;

答案 3 :(得分:1)

如果您使用的是具有三元运算符(如C或Java)的语言,则可以这样做:

t < lo ? lo : (t > hi ? hi : t)

其中t是测试变量,lo和hi是限制。这满足了你的约束,因为它不严格使用if语句,但是三元运算符实际上只是if语句的语法糖。

答案 4 :(得分:0)

我不知道你怎么可能......

(X / 10)&lt; 1? 10:(X / 90> 1→90:X)

数字除以10是否小于1?设为10 其他 如果数字除以90大于90,则设置为90 其他 设为X

请注意,它仍然是隐藏的ifs。 :(