Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::sub_sat

      From cppreference.com
      <cpp‎ |numeric
       
       
       
      Saturation arithmetic
      Functions
      (C++26)
      sub_sat
      (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,
      • the largest or smallest value of typeT, 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

      [edit]Parameters

      x, y - integer values

      [edit]Return value

      Saturatedx- y.

      [edit]Notes

      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 macroValueStdFeature
      __cpp_lib_saturation_arithmetic202311L(C++26)Saturation arithmetic

      [edit]Possible implementation

      Seelibstdc++ (gcc).

      [edit]Example

      Can be previewed onCompiler 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(){}

      [edit]See also

      (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]
      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 ofstd::numeric_limits<T>)[edit]
      [static]
      returns the largest finite value of the given type
      (public static member function ofstd::numeric_limits<T>)[edit]

      [edit]External links

      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
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/numeric/sub_sat&oldid=163026"

      [8]ページ先頭

      ©2009-2025 Movatter.jp