std::saturating_mul
| Definiert in Header <numeric>
|
||
template< class T >
constexpr T saturating_mul( T x, T y ) noexcept;
|
(seit C++26) | |
Berechnet die sättigende Multiplikation x × y. Diese Operation verhält sich (im Gegensatz zu eingebauten arithmetischen Operationen auf Ganzzahlen) so, als ob sie eine mathematische Operation mit einem unendlichen Bereich wäre. Sei q das Ergebnis einer solchen Operation.
Gibt zurück:
q, wennqals Wert des TypsTdarstellbar ist. Andernfalls- den größten oder kleinsten Wert des Typs
T, je nachdem, welcher demqnäher ist.
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 die Arithmetik vorgesehen sind.
Parameter
| x, y | - | Ganzzahlwerte |
Rückgabewert
Gesättigte x × y.
Hinweise
Im Gegensatz zu den eingebauten arithmetischen Operatoren auf Ganzzahlen findet die Ganzzahlpromotion nicht auf die x- und y-Argumente Anwendung.
Wenn zwei Argumente unterschiedlichen Typs übergeben werden, schlägt der Aufruf beim Kompilieren fehl, d. h. das Verhalten bezüglich der Template-Argument-Deduktion 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 | Standard | Merkmal |
|---|---|---|---|
__cpp_lib_saturation_arithmetic |
202311L |
(C++26) | Sättigungsarithmetik |
202603L |
(C++26) | Umbenennung von Sättigungsarithmetik-Funktionen |
Mögliche Implementierung
Siehe libstdc++ (GCC), libc++ (Clang).
Beispiel
Kann auf Compiler Explorer in der Vorschau angezeigt werden.
#include <climits>
#include <numeric>
static_assert
(""
&& (std::saturating_mul<int>(2, 3) == 6) // not saturated
&& (std::saturating_mul<int>(INT_MAX / 2, 3) == INT_MAX) // saturated
&& (std::saturating_mul<int>(-2, 3) == -6) // not saturated
&& (std::saturating_mul<int>(INT_MIN / -2, -3) == INT_MIN) // saturated
&& (std::saturating_mul<unsigned>(2, 3) == 6) // not saturated
&& (std::saturating_mul<unsigned>(UINT_MAX / 2, 3) == UINT_MAX) // saturated
);
int main() {}
Siehe auch
(C++26) |
sättigende Additionsoperation auf zwei Ganzzahlen (Funktionstemplate) |
(C++26) |
sättigende Subtraktionsoperation auf zwei Ganzzahlen (Funktionstemplate) |
(C++26) |
sättigende Divisionsoperation auf zwei Ganzzahlen (Funktionstemplate) |
(C++26) |
gibt einen Ganzzahlwert zurück, der auf den Bereich eines anderen Ganzzahltyps begrenzt ist (Funktionstemplate) |
(C++17) |
begrenzt einen Wert zwischen zwei Grenzwerten (Funktionstemplate & Algorithmus-Funktionsobjekt) |
(C++20) |
|
(C++20) |
überprüft, ob ein Ganzzahlwert im Bereich eines bestimmten Ganzzahltyps liegt (Funktionstemplate) |
[statisch] |
gibt den kleinsten endlichen Wert des gegebenen nicht-Gleitkommatyps zurück, oder den kleinsten positiven normalen Wert des gegebenen Gleitkommatyps (öffentliche statische Mitgliedsfunktion von std::numeric_limits<T>)
|
[statisch] |
gibt den größten endlichen Wert des gegebenen Typs zurück (öffentliche statische Mitgliedsfunktion von std::numeric_limits<T>)
|
Externe Links
| 1. | Eine verzweigungsfreie Implementierung der Sättigungsarithmetik — Locklessinc.com, 2012 |