삼원 비교

Three-way comparison

컴퓨터 공학에서 삼원 비교총질서가 있는 유형에 속하는 두 가지 값 A와 B를 취하여 삼원법의 수학적 법칙에 따라 한 번의 조작으로 A < B, A = B, A > B를 결정한다.

기계 수준 연산

많은 프로세서는 원시 유형에서 그러한 작업을 지원하는 명령 집합을 가지고 있다. 일부 기계는 수화 및 크기 또는 자신의 보완적 표현(서명된 숫자 표현 참조)을 기반으로 정수를 서명했는데, 이 둘 다 양과 음의 구별되는 을 허용한다. 이것은 일관된 총질서가 채택되는 한 3차분법을 위반하지 않는다: -0 = +0 또는 -0 < +0 중 하나가 유효하다. 그러나 일반적인 부동소수점 유형은 삼분법에 대한 예외를 가지고 있다: x < NaN, x > NaN, x = NaN은 모든 부동소수 값 x (NaN 자체를 포함)에 대해 모두 거짓이라는 특수 값 "NaN"(숫자가 아님)이 있다.

고급 언어

역량

C에서 함수는 strcmp 그리고 memcmp 문자열과 메모리 버퍼의 3방향 비교를 각각 수행한다. 그들은 첫 번째 주장이 두 번째 주장보다 사전 편찬적으로 작을 때 음수를 반환하고, 두 번째 주장이 같을 때 0을 반환하며, 그렇지 않을 경우 양수를 반환한다. 이 "차이의 기호"를 반환하는 관습은 표준 정렬 기능에 의해 임의의 비교 기능으로 확장된다. qsort이것은 비교 기능을 논쟁으로 삼고 그것을 준수하도록 요구한다.

C++에서 C++20 개정판은 "공간 연산자"를 추가한다. <=>유사하게 차이의 부호를 반환하고 비교의 엄격성에 따라 다른 유형(서명 정수에 해당)도 반환할 수 있다.[1]

Perl(숫자 비교 전용)에서 cmp 연산자는 문자열 어휘 비교), PHP(버전 7 이후), Ruby 및 "우주선 연산자"인 Apache Groovy에 사용된다. <=> 각각 A < B, A = B, 또는 A > B에 따라 -1, 0 또는 1 값을 반환한다. 파이톤 2.x cmp( 3.x에 제거됨), OCaml compare, 그리고 코틀린 compareTo 함수는 같은 것을 계산한다. Haskell 표준 라이브러리에서는 3방향 비교 기능 compare 의 모든 유형에 대해 정의됨 Ord 클래스; 유형을 반환함 Ordering, 누구의 가치관은? LT (보다 작음), EQ (iii), 그리고 GT ([2]다음보다 작음):

자료 주문 = LT   EQ   GT 

많은 객체지향 언어들은 3방향 비교 방법을 가지고 있는데, 이것은 객체와 또 다른 주어진 객체를 3방향 비교하는 것을 수행한다. 예를 들어, Java에서 를 구현하는 클래스는 Comparable 인터페이스는 음의 정수, 0 또는 양의 정수를 반환하거나 또는 를 던지는 방법을 가지고 있다. NullPointerException (하나의 물체 또는 둘 다인 경우) null). 이와 유사하게, 에서.NET Framework를 구현하는 모든 클래스 IComparable 인터페이스는 그러한 방법을 가지고 있다.

자바 버전 1.5이기 때문에, 같은 것을 를 사용하여 계산할 수 있다. Math.signum 아래에 언급된 산술적 오버플로와 같은 계산적 문제 없이 차이를 알 수 있는 정적 방법. 많은 컴퓨터 언어들은 기능의 정의를 허용하기 때문에 비교(A,B)가 적절하게 고안될 수 있지만 문제는 그것의 내부 정의가 어떤 종류의 3방향 구문을 채택할 수 있는지 아니면 아니면 반복된 시험에서 후퇴해야 하는지에 관한 것이다.

삼원 비교 연산자나 방법을 아직 이용할 수 없는 경우 3원 비교를 실시할 때, A = B와 A < B, 또는 A < B >와 같은 두 가지 비교를 결합하는 것이 일반적이다. 원칙적으로, 컴파일러는 이 두 가지 표현이 하나의 비교와 결과에 대한 다중 테스트로 대체될 수 있다고 추정할 수 있지만, 이 최적화에 대한 언급은 주제에 대한 텍스트에서 찾을 수 없다.

어떤 경우에는 A와 B를 빼서 그 결과의 기호를 조사하여 숫자의 기호를 조사하기 위한 특별지침을 이용하여 3원 비교를 모의실험할 수 있다. 그러나 이를 위해서는 A형과 B형의 차이가 잘 나타나야 한다. 고정 너비 부호 정수는 빼면 넘칠 수 있고, 부동 소수점 숫자는 부호가 정의되지 않은 NaN 값을 가지며, 문자열이 총 순서에 해당하는 차이 함수를 가지지 않는다. 기계 수준에서는 일반적으로 오버플로가 추적되어 감산 후 순서를 결정하는 데 사용될 수 있지만, 이 정보는 일반적으로 상위 수준 언어에서는 이용할 수 없다.

프로그래밍 언어가 제공하는 3방향 조건부의 한 가지 경우, 현재 평가절하된 포트란의 3방향 산술 IF 문장은 산술적 표현식의 부호를 고려하고 결과의 부호에 따라 점프할 3개의 라벨을 제공한다.

     IF (표현) 부정의,,양성의 

C 및 관련 언어의 공통 라이브러리 함수 strcmp는 문자열의 3원 사전 비교지만, 이러한 언어들은 다른 데이터 유형의 일반적인 3원 비교가 부족하다.

우주선 운영자

숫자에 대한 3방향 비교 연산자는 다음과 같이 표시된다. <=> , 루비, 아파치 그로비, PHP, 이클립스 실론, C++에서 우주선 운영자로 불린다.[3]

그 이름의 유래는 랜달 L을 상기시키기 때문이다. HP BASIC Star Trek 게임에서 우주선의 슈워츠.[4] 또 다른 코더는 그것이 스타워즈 소설에 나오는 다스 베이더의 TIE 전투기와 비슷하게 생겼기 때문에 그렇게 이름이 지어졌다고 제안했다.[5]

PHP의 예:

메아리치다 1 <=> 1; // 0 메아리치다 1 <=> 2; // -1 메아리치다 2 <=> 1; // 1 

복합 데이터 유형

3원 비교는 양원 비교와 달리 비원적 데이터 유형의 사전 비교를 구성하고 구축하기 쉽다는 특성이 있다.

Perl의 구성 예는 다음과 같다.

후보선수 비교하다($) {     나의 (a달러, b달러) = @_;     돌아오다 a달러->{구성 단위} cmp b달러->{구성 단위}            a달러->{등수를 매기다} <=> b달러->{등수를 매기다}            a달러->{이름을 붙이다} cmp b달러->{이름을 붙이다}; } 

참고: cmp, Perl에서는 문자열의 경우, <=> 숫자에 대한 것이다. 양방향 등가물들은 덜 작지만 반드시 덜 읽기 쉬운 것은 아니다. 위의 내용은 에 대한 단락 평가를 이용한다. 연산자 및 0은 Perl에서 거짓으로 간주된다. 결과적으로, 첫 번째 비교가 같을 경우(즉, 0으로 평가), 두 번째 비교에 "통과"하게 되며, 0이 아닌 비교를 찾을 때까지 또는 끝까지 도달하게 된다.

파이톤, 루비, 하스켈 등을 포함한 일부 언어에서는 리스트의 비교가 사전 편찬적으로 이루어지는데, 이는 원하는 순서대로 리스트에 값을 넣음으로써 위의 예와 같은 비교 체인을 구축할 수 있다는 것을 의미한다(예: 루비:

[a.구성 단위, a.등수를 매기다, a.이름을 붙이다] <=> [b.구성 단위, b.등수를 매기다, b.이름을 붙이다] 

참고 항목

참조

  1. ^ 허브 서터는 C++ 표준에 3원 비교 연산자를 추가할 것을 제안했다. <=> 구문, "Consistent Comparison"이라는 제목의 논문. "Consistent Comparison" 참조 2017년 11월 C++20 초안에 성공적으로 병합되었다.
  2. ^ 데이터.오더
  3. ^ "Math::Complex". Perl Programming Documentation. Retrieved 26 September 2014.
  4. ^ "Spaceship history (was Re: [dart-misc] DEP meeting notes)".
  5. ^ "Super Spaceship Operator". 2000-12-08. Retrieved 2014-08-06.