포화 산술
Saturation arithmetic포화 산술은 덧셈과 곱셈과 같은 모든 연산을 최소값과 최대값 사이의 고정된 범위로 제한하는 산술의 버전이다.
작업 결과가 최대값보다 크면 최대값으로 설정("클램핑")하고 최소값보다 낮으면 최소값으로 클램핑한다.이름은 값이 극한 값에 도달하면 "포화"되는 방법에서 유래한다. 최소값에서 최대값 또는 소계값까지 추가하면 결과가 달라지지 않는다.
예를 들어 유효한 값의 범위가 -100 ~ 100인 경우 다음과 같은 포화 산술 연산은 다음과 같은 값을 산출한다.
- 60 + 30 → 90.
- 60 + 43 → 100. (기대된 103은 아님)
- (60 + 43) - (75 + 25) → 0. (예상치 않은 -3.) (100 - 100 → 0)
- 10 × 11 → 100. (예상 110은 아님)
- 99 × 99 → 100. (기대되는 9801이 아님)
- 30 × (5 - 1) → 100. (예상 120. (30 × 4 → 100.)
- (30 × 5) - (30 × 1) → (기존 100이 아닌 예상 120. (기존 100이 아닌) 100 - 30 → 70.)
유효한 범위가 0에서 100까지인 경우 포화 감산(satting 뺄셈)의 다른 예는 다음과 같다.
- 30 - 60 → 0 (예상치 않은 -30)
이러한 예에서 알 수 있듯이, 연관성과 분배성과 같은 친숙한 특성은 포화 산술에서 실패할 수 있다.[1]이 때문에 추상수학에서는 다루기가 불쾌하지만, 값이 최대와 최소의 대표 가능한 범위를 갖는 디지털 하드웨어와 알고리즘에서는 중요한 역할을 하게 된다.
현대 용법
일반적으로 범용 마이크로프로세서는 포화 산수를 사용한 정수 산술 연산을 구현하지 않고, 대신 12시부터 1시까지의 시계 위 시간처럼 최대값을 "뒤집고 다니는" 값을 초과하는 값을 최소값으로 하는 구현하기 쉬운 모듈식 산수를 사용한다.하드웨어에서, 최소 0과 최대n r - 1의 모듈식 산술, 여기서 r은 최저 n자리를 제외한 모든 숫자를 폐기함으로써 구현될 수 있다.현대 하드웨어의 대부분을 차지하는 바이너리 하드웨어의 경우, 라디스는 2이고 자릿수는 비트다.
그러나, 비록 구현이 더 어렵지만, 포화 산술은 수많은 실질적인 이점을 가지고 있다.결과는 가능한 한 숫적으로 참답에 가깝다; 8비트 이진 부호 산술의 경우 정답을 130으로 할 때, 모듈식 산술에서 -126의 답을 얻는 것보다 포화 산술에서 127의 답을 얻는 것이 훨씬 덜 놀랍다.마찬가지로 8비트 이진 미서명 산술의 경우 정답이 258일 때 모듈식 산술에서 2의 답을 얻는 것보다 포화 산술에서 255의 답을 얻는 것이 덜 놀랍다.
포화 산술은 또한 최대 또는 최소 값과의 단순 비교(기준이 이러한 값을 취할 수 없는 경우)로 오버플로 비트나 과도한 계산 없이 일관성 있게 추가와 승수를 감지할 수 있게 한다.
또한 포화 산술은 특히 디지털 신호 처리에서 많은 문제에 대한 효율적인 알고리즘을 가능하게 한다.예를 들어, 소리 신호의 음량 수준을 조절하면 오버플로가 발생할 수 있으며, 포화상태는 소리의 왜곡을 랩어라운드보다 현저하게 적게 일으킨다.연구자 G. A. 콘스탄티누스 외 연구원의 말에 따르면:[2]
두 개의 보완 표현을 사용하여 두 개의 숫자를 추가할 때 오버플로우는 "wrap-around" 현상을 유발한다.그 결과는 DSP 시스템의 신호 대 잡음 비에서 치명적인 손실이 될 수 있다.따라서 DSP 설계의 신호는 일반적으로 가장 극단적인 입력 벡터를 제외한 모든 입력 벡터에 대해 오버플로를 방지하도록 적절하게 스케일링되거나 포화 산술 성분을 사용하여 생성된다.
구현
포화 산술 연산은 많은 최신 플랫폼에서 사용할 수 있으며, 특히 그러한 신호 처리 애플리케이션을 위해 Intel MMX 플랫폼에 의해 만들어진 확장 중 하나였다.이 기능은 SSE2와 AVX2 정수 명령 집합의 더 넓은 버전에서도 사용할 수 있다.
정수에 대한 포화 산술은 GNU 컴파일러 모음,[3] LLVM IR, 에펠 등 C, C++를 포함한 다수의 프로그래밍 언어에 대한 소프트웨어에서도 구현되었다.이것은 프로그래머들이 오버플로우의 영향을 더 잘 예측하고 이해하는데 도움을 주며 컴파일러의 경우 대개 최적의 솔루션을 선택한다.
포화상태는 모듈식 산술 연산만 있는 기계의 소프트웨어에서 효율적인 구현이 어려운데, 단순한 구현에는 막대한 파이프라인 지연을 일으키는 분기가 필요하기 때문이다.그러나 모든 x86 CPU(원래 Intel 8086)와 일부 인기 있는 8비트 CPU(예: Zilog Z80)를 포함한 모든 현대 CPU와 그 이전 CPU에서 사용할 수 있는 모듈식 산술과 비트 와이즈 논리 연산만을 사용하여 분기 없이 소프트웨어에서 포화 추가와 뺄셈을 구현할 수 있다.아직 생산 중이다.반면에 단순한 8비트 및 16비트 CPU에서는 분기 알고리즘이 실제로 어셈블리에 프로그래밍되면 더 빨라질 수 있는데, 이는 정지할 파이프라인이 없고 각 명령에는 항상 여러 개의 클럭 사이클이 필요하기 때문이다.오버플로 플래그와 조건부 이동을 제공하는 x86에서는 매우 간단한 지점 없는 코드가 가능하다.[4]
포화 산술은 하드웨어에서 정수 산술에 대해서는 인기가 적지만, 근사 실수를 다루기 위해 가장 많이 사용되는 추상화인 IEEE 부동 소수점 표준은 오버플로가 "인피니티" 또는 "음의 무한도"로 변환되는 포화 형태를 사용하며, 이 결과에 대한 다른 연산은 계속적으로 그 결과를 산출한다.같은 가치이는 단순한 포화도에 비해 장점이 있어 이후의 연산에서는 값을 감소시키는 것이 계산 x - 또는 "exponent overflow"(그리고 "exponent underflow")와 같은 특수 상태가 있을 수 있다.마찬가지로 후속 작업을 통해 지속되거나, 즉각적인 종료를 야기하거나, 또는 에서와 같이 시험될 것이다.IF ACCUMULATOR OVERFLOW ...IBM704용 FORTRAN(1956년 10월)에서와 같이.
참고 항목
메모들
- ^ 사실 비숙성 산술도 한정된 정밀 환경에서는 연관성과 분배성 실패를 겪을 수 있지만, 그러한 실패는 덜 명백해지는 경향이 있다.
- ^ G. A. 콘스탄티데스, P. Y. K. 청, W. 루크.포화 산술 구조 합성.
- ^ "GNU Compiler Collection (GCC) Internals: Arithmetic". GCC Documentation. 언어측 내장
- ^ "Branchfree Saturating Arithmetic". locklessinc.com. Archived from the original on 2019-02-13.
외부 링크
- SARITH: Safe ARITMetic – A Progress Report: 에펠의 포화 산술 성분 보고서.
- 포화상태, GCC 오버플로 빌트인 관점에서 포화상태의 아리메틱을 위한 헤더 전용 C++ 라이브러리.