蟒蛇和C++模数

Python and C++ modulus

本文关键字:模数 C++      更新时间:2023-10-16

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

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

和蟒蛇代码

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

有人可以解释一下吗?太郎

这有点超出我的专业知识,但它的 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)))

结果在:

75
-4
-400

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

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

在 C++11 之前,如果整数除法的任一操作数是 负数,编译器可以自由向上或向下舍入!例如,-5/2 的计算结果可以是 -3 或 -2,具体取决于编译器的方式 轮。但是,大多数现代编译器会截断为 0(因此 -5/2 将等于 -2)。C++11 规范将其更改为显式 定义整数除法应始终截断为 0(或将 更简单地说,删除了分数分量)。

同样在 C++11 之前,如果模运算符的任一操作数是 负数,模量的结果可以是负数或 阳性!例如,-5 % 2 的计算结果可以是 1 或 -1。这 C++11 规范对此进行了收紧,以便 % b 始终解析为 A的标志。

关于Python,你可以看看divmod的文档,其中指出:

取两个(非复杂)数字作为参数并返回一对 使用整数时由其商和余数组成的数字 划分。对于混合操作数类型,二进制算术的规则 运算符适用。对于整数,结果与 (a//b, a % 对于浮点数,结果是 (q, a % b),其中 q 是 通常 math.floor(a/b),但可能比这少 1。无论如何 q * b + a % b 非常接近 a,如果 a % b 不为零,则具有相同的 符号为b,0 <= abs(a % b) <abs(b)>

编辑2:有关此主题的Python编程常见问题解答的更多信息。

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

这主要是由以下愿望驱动的:i % jj具有相同的符号。如果你想要那个,还想要:

i == (i // j) * j + (i % j)

然后整数除法必须返回 地板。C 还要求该标识成立,然后编译器 截断i // j需要使i % j具有与i相同的符号。

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

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

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

我真的不太了解它,但是由于您正在学习C++,我想从我的个人经验中告诉您一些事情,如果您正在用C++制作程序并且正在使用模运算符,并且您总是想要 +ve mod,您应该做这样的事情 -

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

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