std::saturating_mul - cppreference.com

From cppreference.com

template<classT>constexprTsaturating_mul(Tx,Ty)noexcept;(since C++26)Computes the

saturating

multiplication x×y. This operation (unlike built-in

arithmetic operations on integers

) behaves as-if it is a mathematical operation with an infinite range. Let q denote the result of such operation. Returns:

q, if q is representable as a value of type T. Otherwise,

the largest or smallest value of type T, whichever is closer to the q.

This overload participates in overload resolution only if T is an

integer type

, that is: signedchar, short, int, long, longlong, an extended signed integer type, or an unsigned version of such types. In particular, T must not be (possibly cv-qualified) bool, char, wchar_t, char8_t, char16_t, and char32_t, as these types are not intended for arithmetic.

Parameters

x, y - integer values Return value

Saturated x×y.

Notes

Unlike the built-in arithmetic operators on integers, the

integral promotion

does not apply to the x and y arguments.

If two arguments of different type are passed, the call fails to compile, i.e. the behavior relative to

template argument deduction

is the same as for

std::min

or

std::max

.

Most modern hardware architectures have efficient support for saturation arithmetic on

SIMD vectors

, including

SSE2

for

x86

and

NEON

for

ARM

.

Feature-test

macro ValueStdFeature

__cpp_lib_saturation_arithmetic

202311L

(C++26)Saturation arithmetic

202603L

(C++26)Renaming saturation arithmetic functions Possible implementation

See

libstdc++ (GCC)

,

libc++ (Clang)

.

Example

Run this code

#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);intmain(){}See also

saturating_add

(C++26)

saturating addition operation on two integers
(function template)

[edit]

saturating_sub

(C++26)

saturating subtraction operation on two integers
(function template)

[edit]

saturating_div

(C++26)

saturating division operation on two integers
(function template)

[edit]

saturating_cast

(C++26)

returns an integer value clamped to the range of another integer type
(function template)

[edit]

clamp

(C++17)

clamps a value between a pair of boundary values
(function template & algorithm function object)

[edit]

ranges::clamp

(C++20)

in_range

(C++20)

checks if an integer value is in the range of a given integer type
(function template)

[edit]

min

[static]

returns the smallest finite value of the given non-floating-point type, or the smallest positive normal value of the given floating-point type
(public static member function of std::numeric_limits<T>)

[edit]

max

[static]

returns the largest finite value of the given type
(public static member function of std::numeric_limits<T>)

[edit]

External links