Namespaces
Variants

std::saturating_mul

cppreference.net에서
 
 
 
 
헤더 <numeric>
template< class T >
constexpr T saturating_mul( 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)을 참조하십시오.

예제

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

#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<unsigned>(2, 3) == 6) // not saturated
    && (std::saturating_mul<unsigned>(UINT_MAX / 2, 3) == UINT_MAX) // saturated
);

int main() {}

같이 보기

두 정수에 대한 포화 덧셈 연산
(함수 템플릿)
두 정수에 대한 포화 뺄셈 연산
(함수 템플릿)
두 정수에 대한 포화 나눗셈 연산
(함수 템플릿)
값을 다른 정수 타입의 범위로 클램프하여 반환
(함수 템플릿)
(C++17)
값을 경계값 쌍 사이로 클램프
(함수 템플릿 & 알고리즘 함수 객체)
(C++20)
정수 값이 주어진 정수 타입의 범위 내에 있는지 확인
(함수 템플릿)
[static]
주어진 비부동소수점 타입의 가장 작은 유한값, 또는 주어진 부동소수점 타입의 가장 작은 양의 정규값을 반환
(std::numeric_limits<T>의 공용 정적 멤버 함수)
[static]
주어진 타입의 가장 큰 유한값을 반환
(std::numeric_limits<T>의 공용 정적 멤버 함수)

외부 링크

1.  포화 연산의 분기 없는 구현 — Locklessinc.com, 2012