Namensräume
Varianten
Aktionen

std::div_sat

Von cppreference.com
< cpp‎ | numeric
 
 
 
Definiert in der Header-Datei <numeric>
template< class T >
constexpr T div_sat( T x, T y ) noexcept;
(seit C++26)

Berechnet die saturierte Division x / y. Wenn T ein vorzeichenbehafteter Ganzzahltyp ist, x der kleinste (am negativsten) Wert von T ist und y == -1 ist, 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 keine Kern-Konstante, wenn undefiniertes Verhalten auftritt.

Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn T ein Ganzzahltyp ist, d.h.: 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 arithmetische Zwecke gedacht sind.

Inhalt

[bearbeiten] Parameter

x, y - Ganzzahlwerte

[bearbeiten] Rückgabewert

Saturierte x / y.

[bearbeiten] Hinweise

Im Gegensatz zu den eingebauten arithmetischen Operatoren für Ganzzahlen wird die Ganzzahlpromotion nicht auf die Argumente x und y angewendet.

Wenn zwei Argumente unterschiedlichen Typs übergeben werden, schlägt der Aufruf fehl, d.h. das Verhalten in Bezug auf die Template-Argumentdeduktion ist dasselbe wie bei std::min oder std::max.

Die meisten modernen Hardwarearchitekturen unterstützen die Sättigungsarithmetik auf SIMD-Vektoren effizient, 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

[bearbeiten] Mögliche Implementierung

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;
}

[bearbeiten] Beispiel

Kann auf Compiler Explorer in der Vorschau angezeigt werden.

#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() {}

[bearbeiten] Siehe auch

(C++26)
Sättigende Additionsoperation auf zwei ganzen Zahlen
(Funktionstemplate) [bearbeiten]
(C++26)
Sättigende Subtraktionsoperation auf zwei ganzen Zahlen
(Funktionstemplate) [bearbeiten]
(C++26)
Sättigende Multiplikationsoperation auf zwei ganzen Zahlen
(Funktionstemplate) [bearbeiten]
gibt einen Ganzzahlwert zurück, der auf den Bereich eines anderen Ganzzahltyps beschränkt ist
(Funktionstemplate) [bearbeiten]
(C++17)
klemmt einen Wert zwischen einem Paar von Grenzwerte
(Funktionsvorlage) [editieren]
(C++20)
prüft, ob ein Ganzzahlwert im Bereich eines gegebenen Ganzzahltyps liegt
(Funktionsvorlage) [edit]
[static]
gibt den kleinsten endlichen Wert des gegebenen nicht-Gleitkommatyps oder den kleinsten positiven normalen Wert des gegebenen Gleitkommatyps zurück
(public static member function of std::numeric_limits<T>) [bearbeiten]
[static]
gibt den größten endlichen Wert des gegebenen Typs zurück
(public static member function of std::numeric_limits<T>) [bearbeiten]

[bearbeiten] Externe Links

1.  Eine verzweigungsfreie Implementierung der Sättigungsarithmetik — Locklessinc.com, 2012
2.  C++ Weekly - Ep 459 - C++26's Saturating Math Operations — Youtube.com, 2024-12-16