Common mathematical functions | |||||||||||||||||||||||||||||||
Mathematical special functions(C++17) | |||||||||||||||||||||||||||||||
Mathematical constants(C++20) | |||||||||||||||||||||||||||||||
Basic linear algebra algorithms(C++26) | |||||||||||||||||||||||||||||||
Data-parallel types (SIMD)(C++26) | |||||||||||||||||||||||||||||||
Floating-point environment(C++11) | |||||||||||||||||||||||||||||||
Complex numbers | |||||||||||||||||||||||||||||||
Numeric array (valarray ) | |||||||||||||||||||||||||||||||
Pseudo-random number generation | |||||||||||||||||||||||||||||||
Bit manipulation(C++20) | |||||||||||||||||||||||||||||||
Saturation arithmetic(C++26) | |||||||||||||||||||||||||||||||
Factor operations | |||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||
Interpolations | |||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||
Generic numeric operations | |||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||
C-style checked integer arithmetic | |||||||||||||||||||||||||||||||
|
Functions | ||||
(C++26) | ||||
sub_sat (C++26) | ||||
(C++26) | ||||
(C++26) | ||||
(C++26) |
Defined in header <numeric> | ||
template<class T> constexpr T sub_sat( T x, T y)noexcept; | (since C++26) | |
Computes thesaturating subtractionx- y. This operation (unlike built-inarithmetic operations on integers) behaves as-if it is a mathematical operation with aninfinite range. Letq
denote the result of such operation.Returns:
q
, ifq
is representable as a value of typeT
. Otherwise,T
, whichever is closer to theq
.This overload participates in overload resolution only ifT
is aninteger 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, andchar32_t, as these types are not intended for arithmetic.
Contents |
x, y | - | integer values |
Saturatedx- y.
Unlike the built-in arithmetic operators on integers, theintegral promotion does not apply to thex andy arguments.
If two arguments of different type are passed, the call fails to compile, i.e. the behavior relative totemplate argument deduction is the same as forstd::min orstd::max.
Most modern hardware architectures have efficient support for saturation arithmetic onSIMD vectors, includingSSE2 forx86 andNEON forARM.
Feature-test macro | Value | Std | Feature |
---|---|---|---|
__cpp_lib_saturation_arithmetic | 202311L | (C++26) | Saturation arithmetic |
Seelibstdc++ (gcc).
Can be previewed onCompiler Explorer
#include <climits>#include <numeric> static_assert(""&&(std::sub_sat<int>(INT_MIN+4,3)==INT_MIN+1)// not saturated&&(std::sub_sat<int>(INT_MIN+4,5)==INT_MIN)// saturated&&(std::sub_sat<int>(INT_MAX-4,-3)==INT_MAX-1)// not saturated&&(std::sub_sat<int>(INT_MAX-4,-5)==INT_MAX)// saturated&&(std::sub_sat<unsigned>(4,3)==1)// not saturated&&(std::sub_sat<unsigned>(4,5)==0)// saturated); int main(){}
(C++26) | saturating addition operation on two integers (function template)[edit] |
(C++26) | saturating multiplication operation on two integers (function template)[edit] |
(C++26) | saturating division operation on two integers (function template)[edit] |
(C++26) | returns an integer value clamped to the range of another integer type (function template)[edit] |
(C++17) | clamps a value between a pair of boundary values (function template)[edit] |
(C++20) | checks if an integer value is in the range of a given integer type (function template)[edit] |
[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] |
[static] | returns the largest finite value of the given type (public static member function of std::numeric_limits<T> )[edit] |
1. | A branch-free implementation of saturation arithmetic — Locklessinc.com, 2012 |
2. | C++ Weekly - Ep 459 - C++26's Saturating Math Operations — Youtube.com, 2024-12-16 |