FM/MOD — 플로어 나눗셈

FM/MOD — 플로어 나눗셈 (몫과 나머지)

FM/MOD(f-m-slash-mod)는 d1n1로 나누어 플로어(floored) 몫 n3와 나머지 n2를 구하는 코어 단어예요.

출처: FM/MOD — Forth 2012 Standard

본문

스택 효과

( d1 n1 -- n2 n3 )

설명

d1n1로 나누어 플로어 몫 n3와 나머지 n2를 구해요. 입력·출력 스택 인자는 부호가 있어요. n1이 0이거나 몫이 단일 셀 부호 정수의 범위를 벗어나면 애매한 조건이 존재해요.

참조 (See)

  • 3.2.2.1 Integer division(정수 나눗셈)
  • 6.1.2214 SM/REM
  • 6.1.2370 UM/MOD
  • A.6.1.1561 FM/MOD

합리성 (Rationale)

"플로어" 나눗셈 요구 사항을 도입하면서, Forth 83은 다른 언어들에서 흔한, 호스트 CPU의 동작(대개 0을 향해 반올림되는 대칭적)에 따른 나눗셈을 구현하는 것을 선호하는 이들에게 많은 논란과 우려를 만들었어요. 절충 위치를 찾으며, 이 표준은 두 가지 공통 변형, 즉 플로어와 대칭(대칭은 SM/REM 참조)에 대한 프리미티브를 제공해요. FM/MOD는 플로어 버전이에요. 위원회는 명시적으로 이름 붙은 나눗셈 연산자의 완전한 두 세트를 제공하는 것을 고려했지만, 표준을 지나치게 키우고 복잡하게 만든다는 이유로 그렇게 하지 않기로 했어요. 대신 구현자는 선택을 문서화한다면 정상 나눗셈 단어들을 FM/MODSM/REM 중 하나로 정의할 수 있어요. 명시적으로 이름 붙은 연산자 세트를 원하는 사람들은 그렇게 하도록 권장돼요. FM/MOD는 예를 들어 다음을 정의하는 데 사용될 수 있어요:

: /_MOD ( n1 n2 -- n3 n4)
    >R S>D R> FM/MOD
    ;
: /_ ( n1 n2 -- n3)
    /_MOD SWAP DROP
    ;
: _MOD ( n1 n2 -- n3)
    /_MOD DROP
    ;
: */_MOD ( n1 n2 n3 -- n4 n5)
    >R M* R> FM/MOD
    ;
: */_ ( n1 n2 n3 -- n4 )
    */_MOD SWAP DROP
    ;

테스트 (Testing)

T{       0 S>D              1 FM/MOD ->  0       0 }T
T{       1 S>D              1 FM/MOD ->  0       1 }T
T{       2 S>D              1 FM/MOD ->  0       2 }T
T{      -1 S>D              1 FM/MOD ->  0      -1 }T
T{      -2 S>D              1 FM/MOD ->  0      -2 }T
T{       0 S>D             -1 FM/MOD ->  0       0 }T
T{       1 S>D             -1 FM/MOD ->  0      -1 }T
T{       2 S>D             -1 FM/MOD ->  0      -2 }T
T{      -1 S>D             -1 FM/MOD ->  0       1 }T
T{      -2 S>D             -1 FM/MOD ->  0       2 }T
T{       2 S>D              2 FM/MOD ->  0       1 }T
T{      -1 S>D             -1 FM/MOD ->  0       1 }T
T{      -2 S>D             -2 FM/MOD ->  0       1 }T
T{       7 S>D              3 FM/MOD ->  1       2 }T
T{       7 S>D             -3 FM/MOD -> -2      -3 }T
T{      -7 S>D              3 FM/MOD ->  2      -3 }T
T{      -7 S>D             -3 FM/MOD -> -1       2 }T
T{ MAX-INT S>D              1 FM/MOD ->  0 MAX-INT }T
T{ MIN-INT S>D              1 FM/MOD ->  0 MIN-INT }T
T{ MAX-INT S>D        MAX-INT FM/MOD ->  0       1 }T
T{ MIN-INT S>D        MIN-INT FM/MOD ->  0       1 }T
T{    1S 1                  4 FM/MOD ->  3 MAX-INT }T
T{       1 MIN-INT M*       1 FM/MOD ->  0 MIN-INT }T
T{       1 MIN-INT M* MIN-INT FM/MOD ->  0       1 }T
T{       2 MIN-INT M*       2 FM/MOD ->  0 MIN-INT }T
T{       2 MIN-INT M* MIN-INT FM/MOD ->  0       2 }T
T{       1 MAX-INT M*       1 FM/MOD ->  0 MAX-INT }T
T{       1 MAX-INT M* MAX-INT FM/MOD ->  0       1 }T
T{       2 MAX-INT M*       2 FM/MOD ->  0 MAX-INT }T
T{       2 MAX-INT M* MAX-INT FM/MOD ->  0       2 }T
T{ MIN-INT MIN-INT M* MIN-INT FM/MOD ->  0 MIN-INT }T
T{ MIN-INT MAX-INT M* MIN-INT FM/MOD ->  0 MAX-INT }T
T{ MIN-INT MAX-INT M* MAX-INT FM/MOD ->  0 MIN-INT }T
T{ MAX-INT MAX-INT M* MAX-INT FM/MOD ->  0 MAX-INT }T

더 알아보기 (Learn more)

출처: FM/MOD — Forth 2012 Standard