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