WITHIN — 범위 포함 검사

WITHIN — 범위 포함 검사

WITHINn1|u1n2|u2 이상 n3|u3 미만인 범위에 있으면 참 플래그를 반환하는 코어 확장 단어예요. 범위는 래핑을 허용해요.

출처: WITHIN — Forth 2012 Standard

본문

스택 효과

( n1|u1 n2|u2 n3|u3 -- flag )

설명

n1|u1n2|u2 이상이고 n3|u3 미만인 비교를 수행해요. 비교가 오버플로/언더플로 지점을 걸치면 래핑을 허용해요. 결과가 참이면 flag가 참이에요.

참조 (See)

  • A.6.2.2440 WITHIN

합리성 (Rationale)

우리는 순환 숫자 공간(정의되지 않은 용어)을 언급하거나 코드를 제공하지 않고 WITHIN을 설명한다. 다음은 오버플로 지점(o)이 맨 오른쪽, 언더플로 지점(u)이 맨 왼쪽에 있는 숫자 선이다:

u---------------o

고려할 두 가지 경우가 있다: n2|u2... n3|u3 범위가 오버플로/언더플로 지점을 걸치는지 아닌지. 먼저 걸치지 않는 경우를 살펴보자:

u-----[.....)-----o

[n2|u2를, )n3|u3를 나타내고, 점과 [는 범위 안의 수들이다. n3|u3n2|u2보다 크므로 다음 테스트가 n1|u1n2|u2n3|u3 사이에 있는지 결정한다:

n2|u2 <= n1|u1 and n1|u1 < n3|u3.

비교 범위가 오버플로/언더플로 지점을 걸치는 경우:

u.....)-----[.....o

n3|u3n2|u2보다 작고 다음 테스트가 n1|u1n2|u2n3|u3 사이에 있는지 결정한다:

n2|u2 <= n1|u1 or n1|u1 < n3|u3.

WITHIN은 부호 있는 인자와 부호 없는 인자 모두에 동작해야 한다. 한 가지 명백한 구현은 동작하지 않는다:

: WITHIN  OVER > >R SWAP < R> AND ;

2의 보수 산술을 하는 16비트 머신에서 다음 테스트를 고려하라:

33000 32000 34000 WITHIN

위 구현은 부호 없는 수 33000이 분명히 범위 {32000 ... 34000} 안에 있음에도 그 테스트에 대해 false를 반환한다. 문제는 잘못된 구현에서 부호 있는 비교 <가 32000을 33000과 비교할 때 틀린 답을 준다는 것이다. 그 수들이 부호 있는 수로 취급될 때 33000은 음수로 취급되기 때문이다. 위 구현의 <U<로 바꾸면 부호 없는 수에는 동작하지만 특정 부호 있는 수 범위에는 문제를 일으킨다. 2의 보수 머신에서 산술 오버플로를 무시하는 머신(대부분의 머신)에서는 다음 구현이 모든 경우에 동작한다:

: WITHIN  ( test low high -- flag )  OVER - >R - R> U< ;

더 알아보기 (Learn more)

출처: WITHIN — Forth 2012 Standard