首先,我将重复一次,取模b应该等于a-b *(a div b),如果语言不提供模b,那么您将陷入一团糟。表达式a-b *(a div b)实际上是有多少种实现计算模b。
有一些可能的理由。首先是要获得最大速度,因此将div b定义为所使用的处理器将提供的一切。如果您的处理器具有“ div”指令,则div b就是该div指令所做的事情(只要它不是完全疯狂的东西)。
第二个是您想要一些特定的数学行为。首先让我们假设b>0。将div b的结果四舍五入为零是很合理的。因此,4 div 5 = 0,9 div 5 = 1,-4 div 5 = -0 = 0,-9 div 5 = -1。这将为您提供(-a)div b =-(a div b)和(-a)模b =-(a模b)。
这是很合理的,但并不完美。例如(a + b)div b =(a div b)+ 1不成立,例如a = -1。在固定的b> 0的情况下,通常存在(b)个可能的值,使得div b给出相同的结果,除了从-b + 1到b-1的2b-1个值a,其中div b等于0这也意味着,如果a为负数,则模b将为负数。我们希望模b始终为0到b-1范围内的数字。
另一方面,请求a的连续值时,取模b的值应从0到b-1,然后再从0开始,这也是很合理的。并要求(a + b)div b应该是(a div b)+1。要实现这一点,您希望将div b的结果四舍五入为-infinity,因此-1 div b = -1。再次,有缺点。(-a)div b =-(a div b)不成立。重复除以2或除以b> 1的任何数字最终不会得到0的结果。
由于存在冲突,因此语言必须决定哪种优势对他们来说更重要,并据此做出决定。
对于负数b,大多数人无法完全理解div b和模b应该是什么,因此一种简单的方法是定义div b =(-a)div(-b)和a模b =(-a)如果b <0,则为(-b)模,或者对正b使用代码的自然结果。