Namespaces
Variants

std::saturating_div

Von de.cppreference.net
 
 
 
 
Definiert in Header <numeric>
template< class T >
constexpr T saturating_div( T x, T y ) noexcept;
(seit C++26)

Berechnet die sättigende Division x / y. Falls T ein vorzeichenbehafteter Ganzzahltyp ist, x der kleinste (am stärksten negative) Wert von T ist, und y == -1, wird der größte Wert von T zurückgegeben; andernfalls wird x / y zurückgegeben.

y darf nicht 0 sein, andernfalls ist das Verhalten undefiniert. Der Funktionsaufruf ist kein konstanter Kernausdruck, wenn undefiniertes Verhalten auftritt.

Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn T ein Ganzzahltyp ist, das heißt: signed char, short, int, long, long long, ein erweiterter vorzeichenbehafteter Ganzzahltyp oder eine vorzeichenlose Version solcher Typen. Insbesondere darf T nicht (möglicherweise cv-qualifiziert) bool, char, wchar_t, char8_t, char16_t und char32_t sein, da diese Typen nicht für Arithmetik vorgesehen sind.

Parameter

x, y - ganzzahlige Werte

Rückgabewert

Gesättigte x / y.

Hinweise

Im Gegensatz zu den eingebauten arithmetischen Operatoren für ganze Zahlen gilt die integrale Promotion nicht für die x- und y-Argumente.

Wenn zwei Argumente unterschiedlichen Typs übergeben werden, schlägt der Aufruf während der Kompilierung fehl, d.h. das Verhalten bezüglich Template-Argument-Deduktion ist dasselbe wie für std::min oder std::max.

Die meisten modernen Hardwarearchitekturen unterstützen effizient Sättigungsarithmetik auf SIMD-Vektoren, einschließlich SSE2 für x86 und NEON für ARM.

Feature-Test-Makro Wert Std Feature
__cpp_lib_saturation_arithmetic 202311L (C++26) Sättigungsarithmetik
202603L (C++26) Umbenennung von Sättigungsarithmetik-Funktionen

Mögliche Implementierung

namespace detail {
template<class T>
concept integer =
    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::integer T>
constexpr T saturating_div( 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;
}

Beispiel

Kann auf Compiler Explorer angesehen werden.

#include <climits>
#include <numeric>

static_assert
(""
    && (std::saturating_div<int>(6, 3) == 2) // not saturated
    && (std::saturating_div<int>(INT_MIN, -1) == INT_MAX) // saturated
    && (std::saturating_div<unsigned>(6, 3) == 2) // not saturated
);

int main() {}

Siehe auch

sättigende Additionsoperation auf zwei ganzen Zahlen
(Funktionsschablone)
sättigende Subtraktionsoperation auf zwei ganzen Zahlen
(Funktionsschablone)
sättigende Multiplikationsoperation auf zwei ganzen Zahlen
(Funktionsschablone)
gibt einen ganzzahligen Wert zurück, der auf den Bereich eines anderen Ganzzahltyps begrenzt ist
(Funktionsschablone)
(C++17)
begrenzt einen Wert zwischen zwei Grenzwerten
(Funktionsschablone & Algorithmusfunktionsobjekt)
(C++20)
prüft, ob ein ganzzahliger Wert im Bereich eines gegebenen Ganzzahltyps liegt
(Funktionsschablone)
[static]
gibt den kleinsten endlichen Wert des gegebenen Nicht-Gleitkommatyps oder den kleinsten positiven normalen Wert des gegebenen Gleitkommatyps zurück
(öffentliche statische Memberfunktion von std::numeric_limits<T>)
[static]
gibt den größten endlichen Wert des gegebenen Typs zurück
(öffentliche statische Memberfunktion von std::numeric_limits<T>)

Externe Links

1.  Eine verzweigungsfreie Implementierung von Sättigungsarithmetik — Locklessinc.com, 2012