std::sub_sat(3)
π std::sub_sat(3) π
okay so bestie, this is the std::sub_sat(3) page from the C++ Standard Libary manual β and yes we're about to make saturating subtraction make sense, no cap π
π NAME π
std::sub_sat β std::sub_sat
β¨ Synopsis β¨
Defined in header <numeric>
template< class T > (since C++26)
constexpr T sub_sat( T x, T y ) noexcept;
This computes the saturating subtraction x - y. Unlike built-in arithmetic operations on integers, this operation behaves as-if it is a mathematical operation with an infinite range. Let q denote the result of that operation. It returns:
q, ifqis representable as a value of typeT. Otherwise,- the largest or smallest value of type
T, whichever is closer to theq.
This overload participates in overload resolution only if T is an integer type, that is: signed char, short, int, long, long long, 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.
π¦ Exceptions π¦
Throws no exceptions.
π₯ 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 π
__cpp_lib_saturation_arithmeticβ value202311L, std(C++26), feature Saturation arithmetic
π§ Possible implementation π§
See libstdc++ (gcc).
π Example π
Can be previewed on Compiler Explorer.
// Run this code
#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() {}
π See also π
add_satβ saturating addition operation on two integers(C++26)(function template)mul_satβ saturating multiplication operation on two integers(C++26)(function template)div_satβ saturating division operation on two integers(C++26)(function template)saturate_castβ returns an integer value clamped to the range of a another integer type(C++26)(function template)clampβ clamps a value between a pair of boundary values(C++17)(function template)in_rangeβ checks if an integer value is in the range of a given integer type(C++20)(function template)minβ returns the smallest finite value of the given type[static](public static member function of std::numeric_limits<T>)maxβ returns the largest finite value of the given type[static](public static member function of std::numeric_limits<T>)
β External links β
- A branch-free implementation of saturation arithmetic β Locklessinc.com, 2012
π that's the whole vibe, bestie β page std::sub_sat(3), from http://cppreference.com, version/date 2024.06.10. go saturate those ints, periodt πβ¨
π¦ where this page comes from
- nixpkgs unstable: stdman 2024.07.05
- opensuse-leap 16.0: stdman 2024.07.05-bp160.1.9 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms