std::saturating_div
| 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
(C++26) |
sättigende Additionsoperation auf zwei ganzen Zahlen (Funktionsschablone) |
(C++26) |
sättigende Subtraktionsoperation auf zwei ganzen Zahlen (Funktionsschablone) |
(C++26) |
sättigende Multiplikationsoperation auf zwei ganzen Zahlen (Funktionsschablone) |
(C++26) |
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) |
|
(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 |