본문 바로가기

공부기록/C, C++

C와 Python의 음수 나머지 연산 방법의 차이

나머지의 수학적 정의는 다음과 같다.

$ a = bq + r (0 \leq r \leq \left | b \right | ) $

 

하지만, C언어와 Python에서 음수를 포함해 몫과 나머지 계산을 하면, 결과가 다르다.

두 결과 모두 위의 수학적 정의는 만족하지만, 두 언어가 나머지 연산을 하는 방법에 차이가 있다.

아래의 실험결과는, -9 ~ -7 그리고 7~9 의 범위를 3과 -3으로 나눈 몫과 나머지이다.

먼저 몫을 계산하는 방법을 비교해보면,

C언어는 몫에 대해서, 버림을 사용한다. 소수점 뒷부분을 모두 버리기 때문에, 나눗셈에 대한 정수부를 얻을 수 있다.

Python은 몫에 대해서, 내림을 사용한다. 따라서 음수의 경우 정수부가 바뀌는 현상이 나타난다.

 

ex)

C (버림) Python (내림)

8 / 3 = 2.666 -> 2

8 / 3 = 2.666 -> 2

8 / (-3) = -2.666 -> -2

8 / (-3) = -2.666 -> -3

 

이렇게 계산하고 수학적 정의에 맞춰 나머지를 결정한다.

$ a = bq + r (0 \leq r \leq \left | b \right | ) $

 

C Python
8 = 3 * 2 + 2 8 = 3 * 2 + 2
8 = (-3) * (-2) + 2 8 = (-3) * (-3) + (-1)

따라서, 두 결과는 다르지만, 둘 다 수학적 정의는 만족하게 된다.
C언어에서는 X % Y 연산 결과 부호가 X의 부호와 같다. 또한, 3으로 나누나 -3으로 나누나 같은 결과가 나온다.

Python에서는 X % Y 연산 결과의 부호가 Y의 부호와 같다.