std:: div_sat
|
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.
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) |
|
(C++26)
|
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 |