Namespaces
Variants

std:: div_sat

From cppreference.net
Saturation arithmetic
Functions
(C++26)
(C++26)
(C++26)
div_sat
(C++26)
헤더 파일에 정의됨 <numeric>
template < class T >
constexpr T div_sat ( T x, T y ) noexcept ;
(C++26부터)

포화 나눗셈 x / y 를 계산합니다. T 가 부호 있는 정수 형식이고, x T 의 최솟값(가장 음수)이며, y == - 1 인 경우, T 의 최댓값을 반환합니다; 그렇지 않으면 x / y 를 반환합니다.

y 0 이 아니어야 하며, 그렇지 않을 경우 동작은 정의되지 않습니다. 정의되지 않은 동작이 발생할 경우 이 함수 호출은 핵심 상수 표현 이 아닙니다.

이 오버로드는 다음 조건에서만 오버로드 해결에 참여합니다: T 정수형 인 경우, 즉: signed char , short , int , long , long long , 확장 부호 정수형, 또는 이러한 타입들의 부호 없는 버전입니다. 특히, T 는 (가능한 cv-qualified) 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) 포화 산술

가능한 구현

namespace detail {
template<class T>
concept standard_or_extended_integral =
     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::standard_or_extended_integral T>
constexpr T div_sat( 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::div_sat<int>(6, 3) == 2) // not saturated
    && (std::div_sat<int>(INT_MIN, -1) == INT_MAX) // saturated
    && (std::div_sat<unsigned>(6, 3) == 2) // not saturated
);
int main() {}

참고 항목

(C++26)
두 정수에 대한 포화 덧셈 연산
(함수 템플릿)
(C++26)
두 정수에 대한 포화 뺄셈 연산
(함수 템플릿)
(C++26)
두 정수에 대한 포화 곱셈 연산
(함수 템플릿)
다른 정수 타입의 범위로 제한된 정수 값을 반환
(함수 템플릿)
(C++17)
값을 한 쌍의 경계값 사이로 제한
(함수 템플릿)
(C++20)
정수 값이 주어진 정수 타입의 범위 내에 있는지 확인
(함수 템플릿)
[static]
주어진 비부동소수점 타입의 가장 작은 유한값, 또는 부동소수점 타입의 가장 작은 양의 정규값을 반환
( std::numeric_limits<T> 의 public static 멤버 함수)
[static]
주어진 타입의 가장 큰 유한값을 반환
( std::numeric_limits<T> 의 public static 멤버 함수)

외부 링크

1. 브랜치 없는 포화 연산 구현 — Locklessinc.com, 2012
2. C++ Weekly - Ep 459 - C++26의 포화 수학 연산 — Youtube.com, 2024-12-16