문제

얼마인지 알려주세요 (-2) % 5?내 Python 인터프리터에 따르면 3인데 이에 대한 현명한 설명이 있습니까?

일부 언어에서는 결과가 기계에 따라 달라질 수 있다는 것을 읽었지만 확실하지는 않습니다.

도움이 되었습니까?

해결책

그런데:대부분의 프로그래밍 언어는 Python에 동의하지 않으며 결과를 제공합니다. -2.모듈러스의 해석에 따라 이것이 정확합니다.그러나 가장 합의된 수학적 정의는 다음과 같습니다. 그리고 (엄격히 긍정적인) 나머지입니다 아르 자형 분할의 / .보다 정확하게는 0 <= 아르 자형 < 정의상.

다른 팁

네거티브에 대한 모듈러스 연산의 결과는 프로그래밍 언어에 따라 달라지는 것으로 보이며 여기에 목록이 있습니다. http://en.wikipedia.org/wiki/Modulo_Operation

Python 인터프리터가 정확합니다.모듈러스를 계산하는 한 가지 (어리석은) 방법은 결과 값이 0과 (모듈러스 - 1) 사이가 될 때까지 모듈러스를 빼거나 더하는 것입니다.

예:13 mod 5 = (13 − 5) mod 5 = (13 − 10) mod 5 = 3

또는 귀하의 경우:−2 모드 5 = (−2 + 5) 모드 5 = 3

문서에 나와 있는 것처럼 이진 산술 연산, Python은 다음을 보장합니다.

정수 나누기 및 모듈로 연산자는 다음 ID로 연결됩니다. x == (x/y)*y + (x%y).정수 나누기와 모듈로는 내장 함수 divmod()와도 연결됩니다. divmod(x, y) == (x/y, x%y).

그리고 정말로,

>>> divmod(-2, 5)
(-1, 3).

이 방법의 균일성을 시각화하는 또 다른 방법은 다음을 계산하는 것입니다. divmod 작은 숫자 시퀀스의 경우:

>>> for number in xrange(-10, 10):
...     print divmod(number, 5)
...
(-2, 0)
(-2, 1)
(-2, 2)
(-2, 3)
(-2, 4)
(-1, 0)
(-1, 1)
(-1, 2)
(-1, 3)
(-1, 4)
(0, 0)
(0, 1)
(0, 2)
(0, 3)
(0, 4)
(1, 0)
(1, 1)
(1, 2)
(1, 3)
(1, 4)

그럼 0%5는 0이 되어야겠죠?

-1 % 5는 반대 방향으로 가는 다음 허용 숫자이기 때문에 4여야 합니다(즉, 범위를 벗어났기 때문에 5가 될 수 없습니다).

그리고 그 논리에 따르면 -2는 3이 되어야 합니다.

작동 방식을 생각하는 가장 쉬운 방법은 숫자가 0(포함)과 5(제외) 사이에 떨어질 때까지 5를 계속 더하거나 빼는 것입니다.

기계 종속성에 대해 잘 모르겠습니다. 구현된 것을 본 적이 없지만 완료되지 않았다고는 말할 수 없습니다.

다른 답변에서 설명했듯이 음수 값을 사용한 모듈로 연산에는 다양한 선택이 있습니다.일반적으로 다른 언어(및 다른 기계 아키텍처)는 다른 결과를 제공합니다.

에 따르면 파이썬 참조 매뉴얼,

모듈로 연산자는 항상 두 번째 피연산자(또는 0)와 동일한 부호를 갖는 결과를 생성합니다.결과의 절대값은 두 번째 피연산자의 절대값보다 엄격하게 작습니다.

Python이 선택한 것입니다.기본적으로 모듈로는 다음과 같이 항상 유지되도록 정의됩니다.

x == (x/y)*y + (x%y)

따라서 (-2)%5 = -2 - (-2/5)*5 = 3이 되는 것이 합리적입니다.

-2를 5로 나누면 0이 되고 나머지는 3이 됩니다.나는 그것이 플랫폼에 크게 의존해야 한다고 믿지 않지만 이상한 것을 보았습니다.

과연 3입니다.~ 안에 모듈러 연산, 모듈러스는 단순히 나눗셈의 나머지이고, -2를 5로 나눈 나머지는 3입니다.

결과는 언어에 따라 다릅니다.Python은 제수의 부호를 반환합니다. 예를 들어 c#은 피제수의 부호를 반환합니다(예:-2 % 5는 C#에서 -2를 반환합니다.

한 가지 설명은 음수가 다음을 사용하여 저장된다는 것입니다. 2의 보수.Python 인터프리터가 모듈로 연산을 시도하면 부호 없는 값으로 변환됩니다.따라서 (-2) % 5를 수행하는 대신 실제로는 3인 0xFFFF_FFFF_FFFF_FFFD % 5를 계산합니다.

모든 OS 및 아키텍처에서 C/C++의 이 모드 동작에 의존하지 않도록 주의하세요.제 기억이 맞다면 저는 다음과 같은 C/C++ 코드에 의존하려고 했습니다.

float x2 = x % n;

x2를 0에서 n-1 사이의 범위로 유지하려고 했지만 한 OS에서 컴파일할 때 음수가 들어왔지만 다른 OS에서는 문제가 잘 작동했습니다.이는 디버깅 시간의 절반만 발생했기 때문에 디버깅 시간이 좋지 않았습니다!

"모듈로"와 "나머지"라는 용어 사이에 흔히 혼동이 있는 것 같습니다.

수학에서는 나머지가 있어야 합니다. 언제나 몫과 일치하게 정의되어야 합니다. a / b == c rem d 그 다음에 (c * b) + d == a.몫을 어떻게 반올림하느냐에 따라 나머지가 달라집니다.

그러나 모듈로는 항상 결과를 제공해야 합니다. 0 <= r < divisor, 이는 음수를 허용하는 경우 반올림-무한대 나누기와만 일치합니다.나눗셈이 0으로 반올림되는 경우(일반적인 경우) 모듈로와 나머지는 음이 아닌 값에 대해서만 동일합니다.

일부 언어(특히 C 및 C++)는 필요한 반올림/나머지 동작을 정의하지 않으며 % 모호하다.많은 사람들이 반올림을 0에 가까운 것으로 정의하지만 나머지가 더 정확한 경우 모듈로라는 용어를 사용합니다.파이썬은 음의 무한대로 반올림된다는 점에서 비교적 특이하므로 모듈로와 나머지는 동일합니다.

Ada는 IIRC를 0으로 반올림하지만 둘 다 갖습니다. mod 그리고 rem 연산자.

C 정책은 컴파일러가 시스템에 가장 효율적인 구현을 선택할 수 있도록 하기 위한 것이지만, 적어도 요즘에는 IMO가 잘못된 최적화입니다.좋은 컴파일러는 아마도 음수가 발생할 수 없는 곳에서 최적화를 위해 동등성을 사용할 수 있을 것입니다(그리고 부호 없는 유형을 사용하는 경우 거의 확실합니다).반면에 음수가 발생할 수 있는 경우 세부 사항에 신경을 쓰는 것은 거의 확실합니다. 이식성 때문에 반올림 및 나머지에 관계없이 원하는 결과를 얻을 수 있도록 매우 신중하게 설계된 과복소수 알고리즘 및/또는 검사를 사용해야 합니다. 행동.

즉, 이 "최적화"에 대한 이득은 대부분(항상 그런 것은 아니지만) 환상인 반면, 어떤 경우에는 매우 실제적인 비용이 발생하므로 이는 잘못된 최적화입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top