[python] 파이썬에서 음수에 대한 모듈로 연산

음수와 관련하여 Python에서 이상한 동작을 발견했습니다.

>>> -5 % 4
3

아무도 무슨 일이 일어나고 있는지 설명 할 수 있습니까?



답변

C 또는 C ++와 달리 Python의 모듈로 연산자 ( %)는 항상 분모 (제수)와 동일한 부호를 갖는 숫자를 반환합니다. 당신의 표현은 3을 산출합니다.

(-5) / 4 = -1.25-> floor (-1.25) = -2

(-5) % 4 = (-2 × 4 + 3) % 4 = 3.

음이 아닌 결과가 종종 더 유용하기 때문에 C 동작보다 선택됩니다. 예는 요일을 계산하는 것입니다. 오늘이 화요일 (2 일) 인 경우 N 일 전의 요일은 무엇 입니까? 파이썬에서는 다음과 같이 계산할 수 있습니다.

return (2 - N) % 7

그러나 C에서 N ≥ 3이면 잘못된 숫자 인 음수를 얻고 7을 더하여 수동으로 수정해야합니다.

int result = (2 - N) % 7;
return result < 0 ? result + 7 : result;

( 다른 언어에 대해 결과 기호가 결정되는 방법 은 http://en.wikipedia.org/wiki/Modulo_operator 를 참조하십시오 .)


답변

다음은 Guido van Rossum의 설명입니다.

http://python-history.blogspot.com/2010/08/why-pythons-integer-division-floors.html

본질적으로 a / b = q와 나머지 r은 b * q + r = a 및 0 <= r <b의 관계를 유지합니다.


답변

음수로 정수 나누기와 모드를 처리하는 가장 좋은 방법은 없습니다. a/b같은 크기이고 반대 부호 이면 좋을 것 입니다 (-a)/b. a % b실제로 모듈로 b 라면 좋을 것 입니다. 우리가 정말로 원하기 때문에 a == (a/b)*b + a%b처음 두 개는 호환되지 않습니다.

어느 쪽을 지킬 것인지는 어려운 질문이며 양측 모두에 대한 논쟁이 있습니다. C와 C ++는 정수 나눗셈을 0 (so a/b == -((-a)/b)) 으로 반올림 하며 Python은 그렇지 않습니다.


답변

지적했듯이 Python 모듈로는 다른 언어의 규칙에 대한 합당한 예외를 만듭니다 .

이는 특히 모듈로가 자주 사용되는 //것처럼 정수 나누기 연산자 와 함께 사용할 때 음수에 원활한 동작을 제공합니다 %(math. divmod 에서와 같이 ).

for n in range(-8,8):
    print n, n//4, n%4

생성 :

 -8 -2 0
 -7 -2 1
 -6 -2 2
 -5 -2 3

 -4 -1 0
 -3 -1 1
 -2 -1 2
 -1 -1 3

  0  0 0
  1  0 1
  2  0 2
  3  0 3

  4  1 0
  5  1 1
  6  1 2
  7  1 3
  • 파이썬은 %항상 0 또는 양수를 출력합니다 *
  • 파이썬은 //항상 음의 무한대로 반올림합니다.

* … 오른쪽 피연산자가 양수이면됩니다. 반면에11 % -10 == -9


답변

에서 파이썬 , 나머지 연산자는 다음과 같이 작동합니다.

>>> mod = n - math.floor(n/base) * base

결과는 (귀하의 경우) :

mod = -5 - floor(-1.25) * 4
mod = -5 - (-2*4)
mod = 3

C, JAVA, JavaScript 와 같은 다른 언어 는 바닥 대신 잘림을 사용합니다.

>>> mod = n - int(n/base) * base

결과 :

mod = -5 - int(-1.25) * 4
mod = -5 - (-1*4)
mod = -1

파이썬에서 반올림에 대한 더 많은 정보가 필요하면 이것을 읽으십시오 .


답변

4에 대한 모듈로 등가 클래스 :

  • 0 : 0, 4, 8, 12 … 및 -4, -8, -12 …
  • 1 : 1, 5, 9, 13 … 및 -3, -7, -11 …
  • 2 : 2, 6, 10 … 및 -2, -6, -10 …
  • 3 : 3, 7, 11 … 및 -1, -5, -9 …

다음 은 음수를 사용한 모듈로의 동작에 대한 링크 입니다 . (예, 검색했습니다)


답변

나는 또한 그것이 파이썬의 이상한 행동이라고 생각했습니다. 내가 부서를 잘 해결하지 못한 것이 밝혀졌습니다. 나는 몫에 0의 값을, 나머지에 -5의 값을주고 있었다. 끔찍합니다. 정수의 기하학적 표현을 잊어 버렸습니다. 수직선에 의해 주어진 정수의 기하학을 회상함으로써 몫과 나머지에 대한 정확한 값을 얻을 수 있고 파이썬의 동작이 정상인지 확인할 수 있습니다. (이미 오래 전에 우려 사항을 해결했다고 가정하지만).