这不是语言特定的,但我对数学不是很好!
测试A是否在B的倍数的X范围内,最有效的方法是什么?我目前使用的方法是:
# when (A mod B) < (B/2)
if (A modulus B) < X THEN TRUE
# when (A mod B) > (B/2)
if ABS((A modulus B) - B) < X THEN TRUE
实施例1:A大于100×3×B
A=30100
B=10000
X=150
(30100 mod 10000) = 100 < (10000/2)
(30100 modulus 10000) = 100
实施例2:A小于3×B <100
A=29900
B=10000
X=150
(29900 mod 10000) = 9900 > (10000/2)
ABS((29900 modulus 10000) - 10000) = 100
有更好的方法吗?
(为了避免XY问题:我正在编写脚本来监控某些工业机器,并且我希望在生命周期计数器指标在定期维护值的范围内时发出警报。当服务间隔时是10000,警报范围是150,我想知道该计数器何时介于9850和10150之间,或19850和20150之间等)
答案 0 :(得分:2)
你的方式并不差,但做得快一点:
if ((A + X) % B) <= X*2 then
TRUE
else
FALSE
距离&lt; = X.如果你需要距离&lt; X,然后:
if ((A + X + B - 1) % B) <= X*2-2 then
TRUE
else
FALSE
请注意,A + X + B - 1
与A + X - 1
类似,但在X == 0的情况下,可以防止语言对模数运算符和负操作数的奇怪处理。
答案 1 :(得分:1)
我认为最好的方法是你发现的最清楚;但我个人会写相当于(( A + X )MOD B ≤2 X )。例如,在C / Java / Perl / JavaScript / etc。中:
if ((a + x) % b <= 2 * x) {
// A is within X of a multiple of B
}