Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::div_sat

      From cppreference.com
      <cpp‎ |numeric
       
       
       
      Saturation arithmetic
      Functions
      (C++26)
      (C++26)
      (C++26)
      div_sat
      (C++26)
       
      Defined in header<numeric>
      template<class T>
      constexpr T div_sat( T x, T y)noexcept;
      (since C++26)

      Computes thesaturating divisionx/ y. IfT is a signed integer type,x is the smallest (most negative) value ofT, andy==-1, returns the greatest value ofT; otherwise, returnsx/ y.

      y must not be0, otherwise the behavior is undefined. The function call is not acore constant expression if undefined behavior happens.

      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

      namespace detail{template<class T>concept standard_or_extended_integral=std::is_integral_v<T>&&!std::is_same_v<std::remove_cv_t<T>,bool>&&!std::is_same_v<std::remove_cv_t<T>,char>&&!std::is_same_v<std::remove_cv_t<T>, char8_t>&&!std::is_same_v<std::remove_cv_t<T>,char16_t>&&!std::is_same_v<std::remove_cv_t<T>,char32_t>&&!std::is_same_v<std::remove_cv_t<T>,wchar_t>;}// namespace detail template<detail::standard_or_extended_integral T>constexpr T div_sat( T x, T y)noexcept{ifconstexpr(std::is_signed_v<T>)if(x==std::numeric_limits<T>::min()&& y==-1)returnstd::numeric_limits<T>::max();return x/ y;}

      [edit]Example

      Can be previewed onCompiler Explorer.

      Run this code
      #include <climits>#include <numeric> static_assert(""&&(std::div_sat<int>(6,3)==2)// not saturated&&(std::div_sat<int>(INT_MIN,-1)==INT_MAX)// saturated&&(std::div_sat<unsigned>(6,3)==2)// not saturated); int main(){}

      [edit]See also

      (C++26)
      saturating addition operation on two integers
      (function template)[edit]
      (C++26)
      saturating subtraction operation on two integers
      (function template)[edit]
      (C++26)
      saturating multiplication 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/div_sat&oldid=163025"

      [8]ページ先頭

      ©2009-2025 Movatter.jp