Namespaces
Variants

std:: mul_sat

From cppreference.net
Saturation arithmetic
Functions
(C++26)
(C++26)
mul_sat
(C++26)
(C++26)
헤더 파일에 정의됨 <numeric>
template < class T >
constexpr T mul_sat ( 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 .

참고 사항

정수에 대한 내장 산술 연산자와 달리, integral promotion x y 인수에는 적용되지 않습니다.

서로 다른 타입의 두 인자가 전달되면, 호출은 컴파일에 실패합니다. 즉, 템플릿 인자 추론 에 관한 동작은 std::min 또는 std::max 와 동일합니다.

대부분의 현대 하드웨어 아키텍처는 SIMD 벡터 에 대한 포화 산술 연산을 효율적으로 지원합니다. 여기에는 SSE2 ( x86 용)와 NEON ( ARM 용)이 포함됩니다.

기능 테스트 매크로 표준 기능
__cpp_lib_saturation_arithmetic 202311L (C++26) 포화 연산

가능한 구현

참조: libstdc++ (gcc) .

예제

다음에서 미리 볼 수 있습니다: Compiler Explorer .

#include <climits>
#include <numeric>
static_assert
(""
    && (std::mul_sat<int>(2, 3) == 6) // not saturated
    && (std::mul_sat<int>(INT_MAX / 2, 3) == INT_MAX) // saturated
    && (std::mul_sat<int>(-2, 3) == -6) // not saturated
    && (std::mul_sat<int>(INT_MIN / -2, -3) == INT_MIN) // saturated
    && (std::mul_sat<unsigned>(2, 3) == 6) // not saturated
    && (std::mul_sat<unsigned>(UINT_MAX / 2, 3) == UINT_MAX) // 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