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