Modulus operation with negatives values - weird thing?
您能告诉我 我读过某些语言的结果可能与机器有关,但是我不
顺便说一句:大多数编程语言会不同意Python并给出结果 对负数进行模运算的结果似乎与编程语言有关,下面是列表http://en.wikipedia.org/wiki/Modulo_operation
您的Python解释器是正确的。
例如。: 或您的情况:?2 mod 5 =(?2 + 5)mod 5 = 3 就像文档在二进制算术运算中所说的那样,Python确保:
确实
可视化此方法均匀性的另一种方法是为一小序列数字计算
好吧,0%5应该是0,对吧? -1%5应该为4,因为这是下一个允许的反向数字(即,不能为5,因为这超出了范围)。 遵循该逻辑,-2必须为3。 考虑它如何工作的最简单方法是,您不断加减5,直到数字介于0(含)和5(不含)之间。 我不确定机器的依赖性-我从未见过这样的实现,但是我不能说它从未完成。 如其他答案所述,对于具有负值的模运算,有很多选择。通常,不同的语言(和不同的机器体系结构)将给出不同的结果。 根据Python参考手册,
是Python采取的选择。基本上定义了模,以便始终保持:
所以说(-2)%5 = -2-(-2/5)* 5 = 3很有意义 术语"模"和"余数"之间似乎存在一个常见的混淆。
在数学中,应始终定义与商一致的余数,以便如果
但是,取模应始终给出结果
某些语言(尤其是C和C ++)没有定义所需的舍入/余数行为,并且
Ada朝着零IIRC四舍五入,但同时具有 C策略旨在允许编译器为计算机选择最有效的实现,但是IMO至少在最近这些天是错误的优化。一个好的编译器可能会在不会出现负数的地方(并且几乎可以肯定,如果使用无符号类型)可以使用等效项进行优化。另一方面,在可能出现负数的地方,您几乎可以肯定会在乎细节-出于可移植性的原因,您必须使用精心设计的过度复杂算法和/或检查以确保无论舍入和余数如何都得到想要的结果行为。 换句话说,这种"优化"的收益大部分(如果不是总是)是一种幻想,而在某些情况下却存在非常实际的成本-因此这是错误的优化。 注意不要在所有OS和体系结构上都依赖C / C ++中的mod行为。如果我没记错的话,我尝试依赖C / C ++代码,例如
将x2的范围保持在0到n-1之间,但是当我在一个OS上进行编译时,负数会逐渐增加,但是在另一个OS上一切正常。因为它只发生一半的时间,所以调试很麻烦! 一种解释可能是负数使用2的补码存储。当python解释器尝试执行模运算时,它将转换为无符号值。因此,实际上不是计算(-2)%5,而是计算0xFFFF_FFFF_FFFF_FFFD%5,即3。 结果取决于语言。 Python返回除数的符号,例如c#返回除数的符号(即-2%5在c#中返回-2)。 确实为3。在模算术中,模数只是除法的余数,而-2除以5的余数是3。 好吧,-2除以5等于0,其余为3。我不认为这应该与平台密切相关,但是我已经看到了一些奇怪的东西。 |