많은 프로그래밍 언어에서 왜 mod (%)가 기본적인 수학 연산자입니까?


17

과거 또는 다른 이유가 있는데, 왜 모듈러스 연산자가 많은 언어처럼 보이는 소수의 표준 연산자에 속합니까? ( +, -, *, /%, Java 및 C의 경우 **Ruby 및 Python에서).

mod를 "기본"으로 포함시키는 것은 이상하게 보입니다 (노크하지 않고 많이 사용하지만 지수, 절대 값, 바닥 / 천장 또는 기타를 사용합니다-유용하고 필요한 것처럼 보입니다). 이것은 Java, C, Ruby 및 Python이 모두 따르는 언어 또는 그들이 유래 한 언어 인 일부 사양에서 이루어진 오래된 결정입니까? 내가 알 수있는 한 대부분의 Lisp 방언에는 +, -, /and 만 포함 되어 *있습니다.

처음에는 mod가 바이너리 레벨에서 구현하기가 특히 쉬운 지 궁금했습니다 ( "기본 연산자"와 그렇지 않아야 할 것에 대한 결정과 관련하여 차이가있을 수 있습니까?). 내가 생각하는 것보다 프로그래밍에서 훨씬 일반적으로 사용됩니까?

답변:


20

많은 CPU 아키텍처 modulus가 정수 나누기 명령의 두 번째 출력으로 구현하기 때문에 일반적이라고 확신합니다 .

1970 년대 CPU (6800, 8080, Z80, 1604 등)에 있지만 1980 년대에는 Intel 8086 및 8088뿐만 아니라 Motorola 6809에도 있습니다.

PDP-11 명령 아키텍처 DIV는 초기 설계 (1970)에서 몫과 나머지를 생성하도록 지정 했지만 MUL 및 DIV 명령은 초기 설계에는 없었지만 "명령이 구현되지 않은 트랩"에 의해 투명하게 에뮬레이트되어 조금 삐걱 거리는 핸들러. 아마도 PDP-11 기능은이 %기능을 제공하는 최초의 C 언어 판을 장려했을 것 입니다. (백분위 기호에 슬래시가있는 방법을 알고 계십니까? 그러면 부서 관련 운영자에게 현명한 선택이됩니다.)

모듈러스의 존재 C는 아마도 모든 현대 언어에서의 존재를 설명 할 수 있습니다. C매우 큰 자손 가족이 있고 그렇지 않으면 상당히 영향력이있었습니다.


3
1970 년대 초반부터 거의 모든 비 LISP 언어에 대한 +1 C의 영향은 과장 될 수 없습니다.
로스 패터슨

8

많은 프로그래밍 언어에는 두 개의 피연산자가 모두 양수일 때 모듈러스 연산자로 사용될 수있는 "리마인더"연산자가 있습니다. 상기 연산자는 종종 "모듈러스 (modulus)"연산자로 불리우는 데, 이것이 그 주요 용도이기 때문이다. 많은 하드웨어 플랫폼의 분할 하드웨어가 분할을 수행 할 때 자동으로 나머지를 제공하고 다른 수단을 통해 나머지 또는 모듈러스를 계산하는 것이 훨씬 어려울 수 있으므로 언어에는 일반적으로 그러한 연산자가 있습니다.

서명 된 부서에 대한 하드웨어 지원 기록을 모르겠습니다. a / b가 (q, r)을 산출하면 -a / b 또는 a / -b는 (-q, -r)를 산출하지만, 해당 규칙을 사용하여 나누는 것이 특히 유용한 사용 사례를 잘 모르겠습니다. 음수 값에 정수 나누기 또는 "모듈러스"연산을 사용한 거의 모든 경우에 나눗셈에서 순방향 음의 무한대와 실제 모듈러스 연산 ((a + b) / b가 항상 (a / b) +1과 같고 (a + b) % b는 항상 a % b와 같습니다.) 연산자는 그런 식으로 작동하지 않기 때문에 배당의 부호를 테스트하고 다른 코드를 사용해야합니다. 부정적 (negative)-처음에 서명 된 분할 지시를받는 것으로부터 어떤 이익을 부정하는 것. 하드웨어에서 서명 된 부서 지원이 실제로 어떤 목적으로 유용한 지 궁금합니다.

원래의 질문으로 돌아가서, 계수 연산자는 특정 상황이 공간 (예 : 그래픽 좌표) 또는 시간에 주기적으로 발생해야하는 상황에서 종종 유용합니다. 예를 들어, 15 초마다 이벤트가 발생하도록하려면 다음 이벤트까지의 시간이 15-((time_now-time_of_an_occurrence) % 15) 가 아니라고 가정time_of_an_occurrencetime_now 합니다. 경우 time_of_an_occurrence보다 큰했다 time_now, 모듈러스 연산자는 같은 수식을 빼기가 오버 플로우하지 않았다 제공 계속 사용할 수 있지만, 나머지 연산자는 다른 공식이 필요합니다.


3
이러한 이유로 Haskell에는 두 가지 연산자가 있습니다. rem나머지와 mod설명하는 속성을 가진 계수에 대한 연산자 입니다.
Ingo

@Complicatedseebio : 특히 재미있는 점은 모듈러스 연산자라고 불리는데, 코드가 필요할 때에도 일반적으로 모듈러스를 계산하는 데 사용되기 때문 m = number % base; if (m < 0) m+=base;입니다. q = n/d; if (n%d < 0) q+=1;어쨌든 다른 방법으로 더 잘 작성 될 수있는 경우를 제외하고 나머지 연산자가 이익을 얻는 코드를 본 적이 없다는 것을 모르겠습니다 .
supercat

3

모듈러스는 매우 근본적인 수학 이론 인 그룹 및 고리 이론과 밀접한 관련이 있습니다.

지수화는 시퀀스 덧셈, 곱셈, 지수화, 테트라 션 (그리고 무한 시퀀스)에서 세 번째 연산입니다. 주로 컴퓨터 산술에서는 드문 복잡한 숫자로 중요합니다. 하나의 특정 지수가 명시 적으로 지원됩니다 . 컴퓨터는 상당히 이진이므로 2 n 은 일반적으로로 작성됩니다 1<<n.

바닥과 천장은 비교가 매우 드 really니다. :에서 ℤ로 변환 할 때만 적용됩니다. (부동 소수점 정수). 마찬가지로 absℤ에서 ℕ 로의 매핑과 관련이 있습니다.


ℤ는 정수이며 ℕ는 정수의 하위 집합이므로 ℝ에서 ℤ까지를 의미해야합니다.
Joni

@ 조니 : 두 가지 예제가 혼합되어 수정되었습니다.
MSalters

0

죄송하지만, "Call My Bluff"게임으로 바꿀 위험이 있습니다.이 질문에 대한 실제 답변은 매우 간단합니다.

Mod는 "10 진수가 아닌"수량 및 날짜, 시간, 야드, 인치, 온스 등의 단위로 정확한 계산을 허용합니다. 10 진수 계산에서는 프로그래머가 하드웨어에서 제공하는 것 이상의 숫자 정밀도로 작업 할 수있는 방법도 제공합니다 기계의. 이것은 매우 작은 것 (예 : 양자 계산)에서 매우 큰 것 (예 : 새로운 소수 발견)에 이르는 수많은 응용 분야를 가지고 있습니다.

이러한 이유로 컴퓨터를 이러한 이유로 불렀음을 이해하는 것이 중요합니다. 때때로 우리는 우리에게 정답을 줄 필요가 있습니다!


이 대답은 의미가 없습니다 ... "mod"를 사용하는 것과 다른 단위를 사용하는 것의 연결은 무엇입니까 ???
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.