Python和C ++模数

时间:2017-06-07 11:41:09

标签: python c++

我正在学习c ++,在尝试编写一个小程序时,我发现了一些奇怪的东西。它是关于模数: c ++代码

cout << -325 - (-325 % 100) << endl;
// -300 
cout << 325 - (325 % 100);
// 300 

和python代码

print(-325 - (-325 % 100))
# -400 
print(325 - (325 % 100))
# 300

有人可以解释一下吗?那个

3 个答案:

答案 0 :(得分:1)

这有点超出了我的专业知识,但可能的python遵循Donald Knuth余数计算:a + b*[a/b] [] a = -325 b = 100 print(a - b*math.floor(a/b)) print(math.floor(-3.25)) print(-325 -(a - b*math.floor(a/b))) floor操作。如此:

75
-4
-400

结果:

i % j

我有点惊讶C ++没有返回相同(但我对这个主题也不够了解)。

编辑:快速搜索此主题,learncpp提到了为什么C ++,特别是C ++ 11,将地板操作标准化为0的原因。我引用:

  

在C ++ 11之前,如果整数除法的任何一个操作数是   否定,编译器可以自由向上或向下舍入!例如,-5 /   2可以评估为-3或-2,具体取决于编译器的方式   轮。但是,大多数现代编译器都会截断为0(所以-5 / 2   等于-2)。 C ++ 11规范明确地将其更改为   定义整数除法应始终截断为0(或put   更简单地说,小数分量被丢弃了。)

     

同样在C ++ 11之前,如果模数运算符的任一操作数是   否定,模数的结果可以是负数或   正!例如,-5%2可以评估为1或-1。的的   C ++ 11规范将其加强,以便%b始终解析为   a。的标志。

关于Python,您可以查看divmod的文档:

  

将两个(非复数)数字作为参数并返回一对   使用整数时由其商和余数组成的数字   师。对于混合操作数类型,二进制算术的规则   运营商申请。对于整数,结果与(a // b,a%)相同   B)。对于浮点数,结果为(q,a%b),其中q为   通常是math.floor(a / b),但可能比这少1。在任何情况下q *   b + a%b非常接近a,如果%b非零,则它具有相同的值   符号为b ,0&lt; = abs(a%b)&lt; ABS(B)

EDIT2 :有关此主题的Python Programming FAQ更多信息。

  

为什么-22 // 10返回-3?

     

这主要是出于对欲望的驱动   ji == (i // j) * j + (i % j)具有相同的符号。如果你想要,也想要:

     

i // j

     

然后整数除法必须返回   地板。 C还要求持有身份,然后编译器   截断i % j需要使ii % j具有相同的符号。

     

j为负数时,j的实际用例很少。当i % j时   积极的,有很多,而且几乎所有这些都是更多   >= 0-190 % 12 == 2有用。如果时钟现在说10,它说了什么   200小时前? -190 % 12 == -10很有用; {{1}}是一个错误   等着咬。

答案 1 :(得分:0)

看起来phyton不接受负模数结果,因此将100加至-25。

  

打印(-325 - (-325%100))

答案 2 :(得分:0)

我对此并不是很了解,但是因为你正在学习C ++,我想告诉你一些我个人经验,如果你是用C ++编写一个程序而你正在使用模数运算符,你想要+ ve mod总是,你应该做这样的事情 -

a = b%m;
if(a<0) a += m;

我不确定何时以及为何,但是对于任何 b和m(不仅当b是-ve)时,a可以取负值