在C中获得最小非负残差模n的有效方法是什么?

有没有一种有效的方法可以得到最小的非负残差模n,其中n是正的,在C?

如果数字是非负数,那么这很容易,那么它只是%n(其中a是非负整数).

但是当a为负数时,C89中的行为似乎是实现定义的(感谢kennyTM).即-2%11 = -2或9.

最佳答案
此外,在C99中,行为被定义为恼人的行为:-2%11 = -2.

一般来说(即,当m不是常数且n的范围不受约束时,n%m),你可能无法做到比通常更好

res = ((n % m) + m) % m

将它与您平台上的以下内容进行比较可能会很有趣;一个分支可能会赢得额外的模数:

res = n % m;
if (res < 0)  res += m;

转载注明原文:在C中获得最小非负残差模n的有效方法是什么? - 代码日志