Namespaces
Variants

std:: div_sat

From cppreference.net
Saturation arithmetic
Functions
(C++26)
(C++26)
(C++26)
div_sat
(C++26)
Definiert im Header <numeric>
template < class T >
constexpr T div_sat ( T x, T y ) noexcept ;
(seit C++26)

Berechnet die Sättigungsdivision x / y . Wenn T ein vorzeichenbehafteter Ganzzahltyp ist, x der kleinste (negativste) 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 Core Constant Expression , wenn undefiniertes Verhalten auftritt.

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

Inhaltsverzeichnis

Parameter

x, y - Ganzzahlwerte

Rückgabewert

Saturated x / y .

Hinweise

Im Gegensatz zu den eingebauten arithmetischen Operatoren für Ganzzahlen findet keine integral promotion auf die x - und y -Argumente statt.

Wenn zwei Argumente unterschiedlichen Typs übergeben werden, schlägt der Aufruf zur Kompilierung fehl, d.h. das Verhalten in Bezug auf template argument deduction ist dasselbe wie bei std::min oder std::max .

Die meisten modernen Hardware-Architekturen bieten effiziente Unterstützung für 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

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

Beispiel

Kann auf Compiler Explorer vorgeführt 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() {}

Siehe auch

(C++26)
Sättigende Additionsoperation für zwei Ganzzahlen
(Funktionsschablone)
(C++26)
Sättigende Subtraktionsoperation für zwei Ganzzahlen
(Funktionsschablone)
(C++26)
Sättigende Multiplikationsoperation für zwei Ganzzahlen
(Funktionsschablone)
Gibt einen auf den Wertebereich eines anderen Ganzzahltyps begrenzten Ganzzahlwert zurück
(Funktionsschablone)
(C++17)
Begrenzt einen Wert zwischen einem Paar von Grenzwerten
(Funktionsschablone)
(C++20)
Prüft, ob ein Ganzzahlwert im Wertebereich eines gegebenen Ganzzahltyps liegt
(Funktionsschablone)
[static]
Gibt den kleinsten endlichen Wert des gegebenen Nicht-Gleitkommatyps oder den kleinsten positiven Normalwert des gegebenen Gleitkommatyps zurück
(öffentliche statische Elementfunktion von std::numeric_limits<T> )
[static]
Gibt den größten endlichen Wert des gegebenen Typs zurück
(öffentliche statische Elementfunktion von std::numeric_limits<T> )

Externe Links

1. Eine verzweigungsfreie Implementierung von Saturation Arithmetic — Locklessinc.com, 2012
2. C++ Weekly - Ep 459 - C++26's Saturating Math Operations — Youtube.com, 2024-12-16