std::saturating_sub
cppreference.net에서 발췌
| 헤더 <numeric>
|
||
template< class T >
constexpr T saturating_sub( T x, T y ) noexcept;
|
에 정의됨 (C++26부터) | |
포화 뺄셈 x - y을 계산합니다. 이 연산은 (내장 정수 연산과 달리) 무한 범위를 가진 수학적 연산인 것처럼 동작합니다. q를 그러한 연산의 결과라고 합시다.
반환값:
q, 만약q가T유형의 값으로 표현 가능한 경우. 그렇지 않으면,T유형의 가장 큰 값 또는 가장 작은 값 중q에 더 가까운 값.
이 오버로드는 T이 정수 유형인 경우에만 오버로드 해결에 참여합니다. 즉, signed char, short, int, long, long long, 확장 부호 있는 정수 유형, 또는 그러한 유형의 부호 없는 버전입니다. 특히, T은 (cv-한정될 수 있는) bool, char, wchar_t, char8_t, char16_t, char32_t이어서는 안 됩니다. 이러한 유형은 산술용이 아니기 때문입니다.
매개변수
| x, y | - | 정수 값 |
반환값
포화된 x - y.
참고
정수에 대한 내장 산술 연산자와 달리, 정수 승격은 x 및 y 인수에 적용되지 않습니다.
서로 다른 유형의 두 인수가 전달되면 호출이 컴파일되지 않습니다. 즉, 템플릿 인자 추론에 대한 동작은 std::min 또는 std::max와 동일합니다.
대부분의 최신 하드웨어 아키텍처는 SIMD 벡터에 대한 포화 연산을 효율적으로 지원합니다. 여기에는 SSE2(x86용) 및 NEON(ARM용)이 포함됩니다.
| 기능 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_lib_saturation_arithmetic |
202311L |
(C++26) | 포화 연산 |
202603L |
(C++26) | 포화 연산 함수 이름 변경 |
가능한 구현
libstdc++ (GCC), libc++ (Clang)을 참조하십시오.
예제
에서 미리 볼 수 있습니다. 이 코드 실행
#include <climits>
#include <numeric>
static_assert
(""
&& (std::saturating_sub<int>(INT_MIN + 4, 3) == INT_MIN + 1) // not saturated
&& (std::saturating_sub<int>(INT_MIN + 4, 5) == INT_MIN) // saturated
&& (std::saturating_sub<int>(INT_MAX - 4, -3) == INT_MAX - 1) // not saturated
&& (std::saturating_sub<int>(INT_MAX - 4, -5) == INT_MAX) // saturated
&& (std::saturating_sub<unsigned>(4, 3) == 1) // not saturated
&& (std::saturating_sub<unsigned>(4, 5) == 0) // saturated
);
int main() {}
참조
(C++26) |
두 정수에 대한 포화 덧셈 연산 (함수 템플릿) |
(C++26) |
두 정수에 대한 포화 곱셈 연산 (함수 템플릿) |
(C++26) |
두 정수에 대한 포화 나눗셈 연산 (함수 템플릿) |
(C++26) |
다른 정수 유형의 범위로 조여진 정수 값을 반환 (함수 템플릿) |
(C++17) |
값을 경계값 쌍 사이로 조임 (함수 템플릿 & 알고리즘 함수 객체) |
(C++20) |
|
(C++20) |
정수 값이 주어진 정수 유형의 범위 내에 있는지 확인 (함수 템플릿) |
[static] |
주어진 비부동소수점 유형의 가장 작은 유한 값, 또는 주어진 부동소수점 유형의 가장 작은 양수 정규값을 반환 ( std::numeric_limits<T>의 공용 정적 멤버 함수)
|
[static] |
주어진 유형의 가장 큰 유한 값을 반환 ( std::numeric_limits<T>의 공용 정적 멤버 함수)
|
외부 링크
| 1. | 포화 연산의 분기 없는 구현 — Locklessinc.com, 2012 |