std::div_sat
<numeric>
constexpr T div_sat( T x, T y ) noexcept;
Computes the saturating division x / y. If T
is a signed integer type, x is the smallest (most negative) value of T
, and y == -1, returns the greatest value of T
; otherwise, returns x / y.
y must not be 0, otherwise the behavior is undefined. The function call is not a core constant expression if undefined behavior happens.
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.
Contents
[edit] Parameters
[edit] Return value
Saturated x / y.
[edit] 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 | Value | Std | Feature |
---|---|---|---|
__cpp_lib_saturation_arithmetic |
202311L |
(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 { if constexpr (std::is_signed_v <T>) if (x == std::numeric_limits <T>::min() && y == -1) return std::numeric_limits <T>::max(); return x / y; }
[edit] Example
Can be previewed on Compiler Explorer.
[edit] See also
(function template) [edit]
(function template) [edit]
(public static member function of
std::numeric_limits<T>
) [edit]
(public static member function of
std::numeric_limits<T>
) [edit]