“mod”와“remainder”의 차이점은 무엇입니까?


133

제 친구는 "mod"와 "remainder"사이에 차이점이 있다고 말했습니다.

그렇다면 C와 C ++의 차이점은 무엇입니까? '%'는 C에서 "mod"또는 "rem"을 의미합니까?


2
음의 피연산자에 대해서는 잘못 정의되었을 수 있습니다.
Basile Starynkevitch

1
나는 C 사람이 아닙니다 :( 답변 상자 안에 실제로 대답 할 수는 없습니다. 그러나이 기사를 살펴보십시오 :)
bonCodigo

1
%는 나머지입니다. 자세한 내용은 여기-> blogs.msdn.com/b/ericlippert/archive/2011/12/05/…
wim

1
질문의 의미를 정확히 정의 할 때까지 질문은 아무 의미가 없습니다.
David Heffernan

14
@David : 질문은 용어의 의미에 관한 것입니다. 여러 사람이 질문자가 의도 한 방식으로 질문을 이해하더라도 질문에 의미가 없다고 말하면 "mean";-)이라는 단어의 의미가 더 구체적이어야한다고 생각합니다.
Steve Jessop

답변:


140

모듈러스와 나머지는 차이가 있습니다. 예를 들면 다음과 같습니다.

-21모드가 4있습니다 3때문 -21 + 4 x 6입니다 3.

그러나 -21로 나누어 4제공 -5의 나머지 -1.

양수 값의 경우 차이가 없습니다.


22
% 수단 C.에서 REM 수면
banuj

22
@Jinxiao : C89에서 구현 정의이었다 %항상 나머지 이었지만, 수 또한 , C89에 분할 정수 그래서 C89에서 0 대신 대한의 부의 무한대에 가까워 라운드에 허용 되었기 때문에, 계수 (즉, 항상 긍정적 인) 수 -5 / 2-2나머지 -1, 또는 -3나머지 1, 구현은 문서에있는로했다. C99는 유연성을 제거 했으므로 이제는 -5 / 2항상 그렇습니다 -2.
Steve Jessop

2
실제로, 모듈러스가 무엇인지 명확하지 않습니다. 상황과 언어에 따라 많은 다른 정의가있는 것 같습니다. modulo_operation에 대한 위키 백과 기사를 참조하십시오. 일부 상황에서는 실제로 나머지와 동일합니다.
Rudy Velthuis 2016 년

9
누군가 첫 번째 계산의 단계를 설명 할 수 있습니까? 어떻게 -21모드가 4있다 3? 계산은 왜 -21 + 4 x 6됩니까?
오즈 에드 리

13
@OzEdri 숫자 4를 얻기 위해 0과 3 사이의 숫자를 얻는 데 필요한 4의 배수 배수를 추가합니다. -21의 경우, 그 정수는 6 -21 + 4 x 6과 0 사이에 있기 때문에 6 입니다.
David Schwartz

47

'%'는 C에서 "mod"또는 "rem"을 의미합니까?

C %에서 나머지는 1 입니다.

..., /연산자 의 결과는 분수 부분을 버린 대수 몫입니다 ... (종종 "제로쪽으로 절단")

%연산자 의 피연산자 는 정수 유형이어야합니다. C11dr §6.5.5 2

/연산자 의 결과는 첫 번째 피연산자를 두 번째 피연산자로 나눈 몫입니다. %운영자 의 결과는 나머지입니다 ... C11dr §6.5.5 5


“mod”와“remainder”의 차이점은 무엇입니까?

C는 유클리드 디비전 또는 다른 모듈로 에서 사용되는 정수 모듈러스 함수와 같은 "mod"를 정의하지 않습니다 . "유클리드 모드" 는 음 의 a%b경우 C의 작동 과 다릅니다 a.

 // a % b
 7 %  3 -->  1  
 7 % -3 -->  1  
-7 %  3 --> -1  
-7 % -3 --> -1   

유클리드 사업부로서의 모듈로

 7 modulo  3 -->  1  
 7 modulo -3 -->  1  
-7 modulo  3 -->  2  
-7 modulo -3 -->  2   

후보 모듈로 코드 :

int modulo_Euclidean(int a, int b) {
  int m = a % b;
  if (m < 0) {
    // m += (b < 0) ? -b : b; // avoid this form: it is UB when b == INT_MIN
    m = (b < 0) ? m - b : m + b;
  }
  return m;
}

부동 소수점에 대한 참고 사항 : double fmod(double x, double y)"fmod"라고하더라도 유클리드 디비전 "mod"와 동일하지 않지만 C 정수 나머지와 유사합니다.

fmod 함수는의 부동 소수점 나머지를 계산합니다 x/y. C11dr §7.12.10.1 2

fmod( 7,  3) -->  1.0  
fmod( 7, -3) -->  1.0  
fmod(-7,  3) --> -1.0  
fmod(-7, -3) --> -1.0   

명확성 : C double modf(double value, double *iptr)에는 인수 이름 을 정수와 분수 부분으로 나누는 비슷한 명명 된 함수 가 있습니다. 각 함수는 인수와 동일한 유형과 부호를 갖습니다. 이것은 이름 유사성을 제외하고 여기서 "mod"토론과는 거의 관련이 없습니다.


1 C99 이전에 C의 정의 %는 여전히 나눗셈 의 나머지 부분 이었지만 /"0으로 자르기"보다는 음의 몫을 내림 할 수있었습니다. C89에서 정수 나누기에 다른 값을 얻는 이유는 무엇입니까?를 참조하십시오 . . 따라서 일부 C99 이전 컴파일에서는 %코드가 유클리드 부서 "mod"처럼 작동 할 수 있습니다. 위의 내용 modulo_Euclidean()은이 오래된 학교 잔재에도 적용됩니다.


1
C에서 유클리드 분할 및 모듈로 함수를 구현하려면 컴퓨터 과학자를위한 분할 및 모듈을 참조하십시오 . 배당금이 마이너스 일 수 있다는 것을 알고 있으면 더 빨리 달릴 수 있지만 제수는 항상 긍정적입니다 : godbolt.org/g/63UqJo . 관련 : 하여 x86의 ASM의 질문은 음이 아닌 모듈을 요청
피터 코르

모듈로 연산자의 일반적인 정의는 다음과 같습니다.
Mike Housky

2

모듈러스 산술의 모듈러스는 산술 분할 후 남은 값 또는 남은 값입니다. 이것을 일반적으로 나머지라고합니다. %는 공식적으로 C / C ++의 나머지 연산자입니다. 예:

7 % 3 = 1  // dividend % divisor = remainder

토론을 위해 남겨진 것은이 % 연산에 부정적인 입력을 처리하는 방법입니다. 최신 C 및 C ++는이 연산에 대해 부호 있는 나머지 값을 생성합니다. 여기서 결과 의 부호는 제수 입력 부호와 상관없이 항상 배당 입력 값과 일치합니다 .


1

C 및 C ++ 및 많은 언어 %에서 나머지는 계수 연산자가 아닙니다.

예를 들어 연산 -21 / 4에서 정수 부분은 -5이고 소수 부분은 -.25입니다. 나머지는 제수의 일부인 분수이므로 나머지는 -1입니다. JavaScript는 나머지 연산자를 사용하여이를 확인합니다.

console.log(-21 % 4 == -1);

모듈러스 연산자는 "시계"가있는 것과 같습니다. 12시, 3시, 6시 및 9시 위치에 각각 0, 1, 2 및 3의 값을 가진 원을 상상해보십시오. 시계 방향으로 몫의 몫을 시계 방향으로 돌리면 계수 연산의 결과 또는 반 시계 방향으로 음의 몫으로 3을 산출합니다.

참고 : 계수는 항상 제수와 같은 부호이며 나머지는 몫과 같은 부호입니다. 나머지 하나 이상이 음수 일 때 제수와 나머지를 더하면 계수가 산출됩니다.


-2

수학에서 모듈로 연산의 결과는 유클리드 디비전의 나머지입니다. 그러나 다른 규칙도 가능합니다. 컴퓨터와 계산기에는 숫자를 저장하고 나타내는 다양한 방법이 있습니다. 따라서 모듈로 연산의 정의는 프로그래밍 언어 및 / 또는 기본 하드웨어에 따라 다릅니다.

 7 modulo  3 -->  1  
 7 modulo -3 --> -2 
-7 modulo  3 -->  2  
-7 modulo -3 --> -1 

2
위키 유클리드 부문은 주장 0 ≤ r < |b|일명 나머지 의미 "모듈로 연산을." -2와 -1의 결과는 무엇입니까?
chux-복원 Monica Monica

선생님, 내가 더 해달라고 없지만 난 그냥 구글 7 모듈 -3 -> -2 .and.-7 모듈 -3 -> -1 이런 일이 왜 선생님을 설명해주십시오
shub 샤르마

1
Google은 Wiki Euclidean 부서 (Raymond T. Boute가 설명)와는 다른 모듈로 정의 (서명 된 모듈로?)를 사용합니다. 이것은 더 차이에 대해 설명합니다. 이야기의 도덕적 : a%b그리고 a modulo b때 동일한 의미를 가지고 a,b긍정적이다. C99는 %음수 값으로 정확하게 정의 합니다. C이 '나머지'. "호출 모듈로는"음의 값에 관한 세계의 다양한 정의가 C 사양 만 사용합니다. "양수의 맥락에서"모듈을.
chux - 분석 재개 모니카에게
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.