这不是特定于语言的,但我不太擅长数学!
测试 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 比 3 x B 多 100
A=30100
B=10000
X=150
(30100 mod 10000) = 100 < (10000/2)
(30100 modulus 10000) = 100
示例 2:A 小于 100 x B
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 之间,等等(
你的方式还不错,但做起来更快一点:
if ((A + X) % B) <= X*2 then
TRUE
else
FALSE
这是距离 <= X。 如果您需要
if ((A + X + B - 1) % B) <= X*2-2 then
TRUE
else
FALSE
请注意,A + X + B - 1
就像A + X - 1
,但在 X == 0 的情况下,您的语言可能会对模运算符和负操作数产生任何奇怪的影响。
我认为最好的方法是你认为最清楚的;但就我个人而言,我会写相当于((A + X( MOD B ≤ 2X(。例如,在C/Java/Perl/JavaScript/etc中:
if ((a + x) % b <= 2 * x) {
// A is within X of a multiple of B
}