std::saturating_div
cppreference.net에서
| 헤더 <numeric>
|
||
template< class T >
constexpr T saturating_div( T x, T y ) noexcept;
|
에 정의됨 (C++26부터) | |
포화 나눗셈을 계산합니다x / y. 만약 T이 부호 있는 정수 타입이고, x가 T의 가장 작은 (가장 음수인) 값이며, y == -1이면, T의 가장 큰 값을 반환합니다; 그렇지 않으면 x / y을 반환합니다.
y은(는) 0이 아니어야 합니다0, 그렇지 않으면 동작이 정의되지 않습니다. 이 함수 호출은 정의되지 않은 동작이 발생할 경우 핵심 상수 표현식이 아닙니다.
이 오버로드는 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) | 포화 연산 함수 이름 변경 |
가능한 구현
namespace detail {
template<class T>
concept integer =
std::is_integral_v<T> &&
!std::is_same_v<std::remove_cv_t<T>, bool> &&
!std::is_same_v<std::remove_cv_t<T>, char> &&
!std::is_same_v<std::remove_cv_t<T>, char8_t> &&
!std::is_same_v<std::remove_cv_t<T>, char16_t> &&
!std::is_same_v<std::remove_cv_t<T>, char32_t> &&
!std::is_same_v<std::remove_cv_t<T>, wchar_t>;
} // namespace detail
template<detail::integer T>
constexpr T saturating_div( T x, T y ) noexcept
{
if constexpr (std::is_signed_v<T>)
if (x == std::numeric_limits<T>::min() && y == -1)
return std::numeric_limits<T>::max();
return x / y;
}
|
예제
Compiler Explorer에서 미리 볼 수 있습니다.
이 코드 실행
#include <climits>
#include <numeric>
static_assert
(""
&& (std::saturating_div<int>(6, 3) == 2) // not saturated
&& (std::saturating_div<int>(INT_MIN, -1) == INT_MAX) // saturated
&& (std::saturating_div<unsigned>(6, 3) == 2) // not saturated
);
int main() {}
같이 보기
(C++26) |
두 정수에 대한 포화 덧셈 연산 (함수 템플릿) |
(C++26) |
두 정수에 대한 포화 뺄셈 연산 (함수 템플릿) |
(C++26) |
두 정수에 대한 포화 곱셈 연산 (함수 템플릿) |
(C++26) |
정수 값을 다른 정수 타입의 범위로 고정하여 반환 (함수 템플릿) |
(C++17) |
값을 한 쌍의 경계 값 사이로 고정시킵니다 (함수 템플릿 & 알고리즘 함수 객체) |
(C++20) |
|
(C++20) |
정수 값이 주어진 정수 타입의 범위 안에 있는지 확인 (함수 템플릿) |
[static] |
주어진 비부동 소수점 타입의 가장 작은 유한 값, 또는 주어진 부동 소수점 타입의 가장 작은 양의 정규 값을 반환 (public static member function of std::numeric_limits<T>)
|
[static] |
주어진 타입의 가장 큰 유한 값을 반환 (public static member function of std::numeric_limits<T>)
|
외부 링크
| 1. | 분기 없는 포화 연산 구현 — Locklessinc.com, 2012 |