我正在学习c ++,在尝试编写一个小程序时,我发现了一些奇怪的东西。它是关于模数: c ++代码
cout << -325 - (-325 % 100) << endl;
// -300
cout << 325 - (325 % 100);
// 300
和python代码
print(-325 - (-325 % 100))
# -400
print(325 - (325 % 100))
# 300
有人可以解释一下吗?那个
答案 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?
这主要是出于对欲望的驱动
j
与i == (i // j) * j + (i % j)
具有相同的符号。如果你想要,也想要:
i // j
然后整数除法必须返回 地板。 C还要求持有身份,然后编译器 截断
i % j
需要使i
与i % 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可以取负值