numeric_saturating_mul

numeric_saturating_mul (포화 곱셈)

std::saturating_mul은 포화 곱셈 x × y를 계산하는 함수예요. C++26부터 사용할 수 있어요.

출처: cppreference

본문

<numeric> 헤더에 정의되어 있고, 시그니처는 다음과 같아요.

template< class T >
constexpr T saturating_mul( T x, T y ) noexcept;

(since C++26)

포화 곱셈 x × y를 계산해요. 이 연산은 무한 범위의 수학적 연산처럼 동작해요. 그 결과를 q라고 해요.

다음을 반환해요:

  • q를 T 타입의 값으로 표현할 수 있으면 q. 그 외에는,
  • q에 더 가까운 T 타입의 가장 큰 값 또는 가장 작은 값.

이 오버로드는 T가 정수 타입일 때만 오버로드 해석에 참여해요. 특히 T는 (cv 한정된) bool, char, wchar_t, char8_t, char16_t, char32_t가 아니어야 해요.

매개변수 (Parameters)

  • x, y — 정수 값

반환값 (Return value)

포화된 x × y.

참고 (Notes)

정수의 내장 산술 연산자와 달리, x와 y 인자에는 정수 승격이 적용되지 않아요.

서로 다른 타입의 두 인자를 전달하면 호출이 컴파일되지 않아요.

대부분의 현대 하드웨어 아키텍처는 SIMD 벡터에 대한 포화 산술을 효율적으로 지원해요.

피처 테스트 매크로 표준 기능
__cpp_lib_saturation_arithmetic 202311L (C++26) 포화 산술
202603L (C++26) 포화 산술 함수 이름 변경

가능한 구현 (Possible implementation)

libstdc++ (GCC), libc++ (Clang) 참고.

예제 (Example)

이 코드를 실행해 봐요.

#include <climits>
#include <numeric>

static_assert
(""
    && (std::saturating_mul<int>(2, 3) == 6) // not saturated
    && (std::saturating_mul<int>(INT_MAX / 2, 3) == INT_MAX) // saturated
    && (std::saturating_mul<int>(-2, 3) == -6) // not saturated
    && (std::saturating_mul<int>(INT_MIN / -2, -3) == INT_MIN) // saturated
    && (std::saturating_mul<int>(INT_MIN, -1) == INT_MAX)); // saturated

더 알아보기 (Learn more)

cppreference