我发现,根据所使用的语言,相同的mod操作会产生不同的结果。
在Python中:
-1 % 10产生9
在C语言中,它生成-1!
发布于 2009-12-15 13:48:13
((n % M) + M) % M来获得与Python相同的结果。例如((-1 % 10) + 10) % 10。注意,对于正整数:((17 % 10) + 10) % 10 == 17 % 10以及C实现的两个变体(正余数或负余数),它仍然是如何工作的。发布于 2009-12-15 14:11:20
Python有一个“真”模块操作,而C有一个剩余操作。
它与负整数除法的处理方式有直接关系,即向0或负无穷远四舍五入。Python循环为负无穷,C(99)为0,但在两种语言中都是(n/m)*m + n%m == n,因此%运算符必须在正确的方向上进行补偿。
Ada更明确,两者兼具,如mod和rem。
发布于 2009-12-15 14:38:36
在C89/90中,带有负操作数的除法运算符和余数运算符的行为是实现定义的,这意味着取决于实现,您可以得到任何一种行为。它只是要求运营商之间的一致:从a / b = q和a % b = r跟随a = b * q + r。在代码中使用静态断言来检查行为,如果行为严重依赖于结果。
在C99中,您观察到的行为已经成为标准行为。
事实上,这两种行为都有一定的逻辑。Python的行为实现了真正的模块化操作。您所观察到的行为是C与向0的舍入一致(也是Fortran行为)。
C中倾向于0舍入的原因之一是,期望-a / b的结果与-(a / b)相同是相当自然的。对于真正的模块化行为,-1 % 10将计算为9,这意味着-1 / 10必须是-1。这可能被认为是相当不自然的,因为-(1 / 10)是0。
https://stackoverflow.com/questions/1907565
复制相似问题